B Buffoon

判断最大值是不是第一个数,签到题。

H Hour for a Run

输出\(n*m\)的\(10\%\)到\(90\%\),签到题,注意别用浮点数和ceil,有精度问题。

M Maratona Brasileira de Popcorn

题有点难读,就是给n个数,m个人,每人分一个连续段,每个数只能分给一个人,每人每秒最多把数字减k,问最少时间。

二分每一段的上界,贪心判断即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+50;
  4. int n,m,k,a[N];
  5. bool check(int x){
  6. int c=1;
  7. int tmp=0;
  8. for(int i=1;i<=n;i++){
  9. if(a[i]>x){
  10. return false;
  11. }
  12. if(tmp+a[i]<=x){
  13. tmp+=a[i];
  14. }else{
  15. c++;
  16. tmp=a[i];
  17. }
  18. }
  19. return c<=m;
  20. }
  21. int main(){
  22. scanf("%d%d%d",&n,&m,&k);
  23. int sum=0;
  24. for(int i=1;i<=n;i++){
  25. scanf("%d",&a[i]);
  26. sum+=a[i];
  27. }
  28. int l=1,r=sum;
  29. int ans=0;
  30. while(l<=r){
  31. int mid=(l+r)/2;
  32. if(check(mid)){
  33. r=mid-1;
  34. ans=mid;
  35. }else{
  36. l=mid+1;
  37. }
  38. }
  39. printf("%d\n",(ans-1)/k+1);
  40. return 0;
  41. }

D Denouncing Mafia

题意相当于给定一棵树,找出k条链使得覆盖的点最多。

  • 考虑贪心,每次肯定拿最长的一条链,然后拿走这条链后,树会变成一个森林,下一次再从这些树中取出最长链,再加入一些树

  • dfs一遍预处理出每个节点对应子树的最长链和删去最长链后得到的森林根节点,用一个优先队列贪心取即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+55;
  4. vector<int> g[N];
  5. int ld[N];
  6. vector<int> ls[N];
  7. int n,k,f;
  8. struct node{
  9. int u,w;
  10. bool operator<(const node& rhs)const{
  11. return w<rhs.w;
  12. }
  13. };
  14. void dfs(int u){
  15. int siz=g[u].size();
  16. if(!siz){
  17. ld[u]=1;
  18. return;
  19. }
  20. int mx=0;
  21. int k=0;
  22. for(int i=0;i<siz;i++){
  23. int v=g[u][i];
  24. dfs(v);
  25. if(ld[v]>mx){
  26. mx=ld[v];
  27. k=v;
  28. }
  29. }
  30. ld[u]=mx+1;
  31. for(int i=0;i<siz;i++){
  32. int v=g[u][i];
  33. if(v!=k){
  34. ls[u].push_back(v);
  35. }
  36. }
  37. int vs=ls[k].size();
  38. for(int j=0;j<vs;j++){
  39. ls[u].push_back(ls[k][j]);
  40. }
  41. }
  42. int main(){
  43. //freopen("in.txt","r",stdin);
  44. scanf("%d%d",&n,&k);
  45. for(int i=2;i<=n;i++){
  46. scanf("%d",&f);
  47. g[f].push_back(i);
  48. }
  49. dfs(1);
  50. priority_queue<node> pq;
  51. pq.push({1,ld[1]});
  52. int ans=0;
  53. while(!pq.empty()){
  54. auto t=pq.top();
  55. int u=t.u;
  56. int w=t.w;
  57. pq.pop();
  58. ans+=w;
  59. k--;
  60. if(!k){
  61. break;
  62. }
  63. int siz=ls[u].size();
  64. for(int i=0;i<siz;i++){
  65. pq.push({ls[u][i],ld[ls[u][i]]});
  66. }
  67. }
  68. printf("%d\n",ans);
  69. return 0;
  70. }

L Less Coin Tosses

题意本质就是长度为n的所有01串,0和1个数相同的可以匹配,找出不能匹配的01串个数。

  • 先考虑枚举0(或者1)的个数,这样的串有\(C_n^i\)个,那么这些串的01个数显然相同,如果偶数,可以一一匹配,如果是奇数,答案加1。

  • 所以本质就是求\(\sum_{i=1}^n C_n^i\%2\),打表找规律,发现有一个递归翻倍的常见套路。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll n;
  5. ll pw[115],f[115];
  6. int cnt;
  7. void init(){
  8. pw[0]=1;
  9. f[0]=pw[0]-1;
  10. for(int i=1;i<=105;i++){
  11. pw[i]=pw[i-1]*2;
  12. f[i]=pw[i]-1;
  13. if(pw[i]>(ll)1e18){
  14. cnt=i;
  15. break;
  16. }
  17. }
  18. }
  19. ll solve(int k,ll n){
  20. if(k==1){
  21. return 2ll;
  22. }
  23. ll mid=pw[k-1]/2;
  24. if(n<=mid){
  25. return solve(k-1,n);
  26. }else{
  27. return 2ll*solve(k-1,n-mid);
  28. }
  29. }
  30. int main(){
  31. init();
  32. scanf("%lld",&n);
  33. int k=lower_bound(f+1,f+1+cnt,n)-f;
  34. ll ans=solve(k,n-f[k-1]);
  35. printf("%lld\n",ans);
  36. return 0;
  37. }

G Getting Confidence

给定\(n*n\)的矩阵,每列选一个数且不能同一行,使得乘积最大。

  • 做过类似套路的题目,将数求个对数,然后乘积最大就是和最大,然后网络流建图,限制每行每列,跑个最小费用最大流。
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+50;
  4. const int INF=0x3f3f3f3f;
  5. const double DINF=1.0*1e18;
  6. const double eps=1e-8;
  7. struct Edge{
  8. int u,v,w;
  9. double c;
  10. int next;
  11. }e[N];
  12. int ns,n,mt[105][105];
  13. int cnt,head[N];
  14. void init(){
  15. cnt=0;
  16. memset(head,-1,sizeof(head));
  17. }
  18. void add(int u,int v,int w,double c){
  19. e[cnt]=Edge{u,v,w,c,head[u]};
  20. head[u]=cnt++;
  21. e[cnt]=Edge{v,u,0,-c,head[v]};
  22. head[v]=cnt++;
  23. }
  24. double d[N];
  25. int inq[N],s,t,p[N],a[N];
  26. bool bf(int &flow,double &cost){
  27. for(int i=0;i<ns;i++){
  28. d[i]=DINF;
  29. inq[i]=0;
  30. }
  31. d[s]=0;
  32. p[s]=0;
  33. a[s]=INF;
  34. queue<int> q;
  35. q.push(s);
  36. inq[s]=1;
  37. while(!q.empty()){
  38. int u=q.front();
  39. q.pop();
  40. inq[u]=false;
  41. for(int i=head[u];i!=-1;i=e[i].next){
  42. int v=e[i].v;
  43. int w=e[i].w;
  44. double c=e[i].c;
  45. if(w>0 && d[v]>d[u]+c){
  46. d[v]=d[u]+c;
  47. p[v]=i;
  48. a[v]=min(a[u],w);
  49. if(!inq[v]){
  50. q.push(v);
  51. inq[v]=1;
  52. }
  53. }
  54. }
  55. }
  56. if(fabs(d[t]-DINF)<eps){
  57. return 0;
  58. }
  59. flow+=a[t];
  60. cost+=d[t]*a[t];
  61. for(int u=t;u!=s;u=e[p[u]].u){
  62. e[p[u]].w-=a[t];
  63. e[p[u]^1].w+=a[t];
  64. }
  65. return 1;
  66. }
  67. void mcmf(int &flow,double &cost){
  68. flow=0;
  69. cost=0.0;
  70. while(bf(flow,cost));
  71. }
  72. int main(){
  73. //freopen("in.txt","r",stdin);
  74. scanf("%d",&n);
  75. for(int i=1;i<=n;i++){
  76. for(int j=1;j<=n;j++){
  77. scanf("%d",&mt[i][j]);
  78. }
  79. }
  80. ns=(n+2)*n+2;
  81. s=0,t=ns-1;
  82. init();
  83. for(int i=1;i<=n;i++){
  84. add(s,n*n+i,1,0.0);
  85. }
  86. for(int i=1;i<=n;i++){
  87. add(n*n+n+i,t,1,0.0);
  88. }
  89. for(int i=1;i<=n;i++){
  90. for(int j=1;j<=n;j++){
  91. add(n*n+i,(j-1)*n+i,1,0.0);
  92. add((j-1)*n+i,n*n+n+j,1,-log10(mt[j][i]));
  93. }
  94. }
  95. int flow=0;
  96. double cost=0;
  97. mcmf(flow,cost);
  98. for(int i=n*n+1;i<=n*n+n;i++){
  99. for(int j=head[i];j!=-1;j=e[j].next){
  100. if(e[j].w==0){
  101. printf("%d",(e[j].v-1)/n+1);
  102. if(i==n*n+n){
  103. printf("\n");
  104. }else{
  105. printf(" ");
  106. }
  107. break;
  108. }
  109. }
  110. }
  111. return 0;
  112. }

J Jar of Water Game

题意不清的模拟题...还好队友什么牌都玩过

n个人,每个人有4张牌,初始指定第k个人有一张万能牌且从他开始,每次选一张出现次数最少的牌给下一个人,如果有万能牌且不是刚拿到,必须把万能牌给下一个人,如果有多个牌出现次数一样小,给那个值小的。

胜利的状态定义为手上有4张相同的牌,不能有万能牌,如果有多少胜利状态的人,即相同牌值小的胜利。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int idx(char c){
  4. if(c=='A'){
  5. return 1;
  6. }else if(c>='2' && c<='9'){
  7. return c-'0';
  8. }else if(c=='D'){
  9. return 10;
  10. }else if(c=='Q'){
  11. return 11;
  12. }else if(c=='J'){
  13. return 12;
  14. }else if(c=='K'){
  15. return 13;
  16. }else if(c=='X'){
  17. return 14;
  18. }
  19. }
  20. int n,k;
  21. struct node{
  22. int cnt[15];
  23. int tm;
  24. bool has;
  25. }a[1005];
  26. char s[10];
  27. int win(){
  28. int ans=0;
  29. int res=0x3f3f3f3f;
  30. for(int x=1;x<=n;x++){
  31. int mx=0;
  32. int mk=0;
  33. for(int i=1;i<=13;i++){
  34. mx=max(mx,a[x].cnt[i]);
  35. if(a[x].cnt[i]>mx){
  36. mx=a[x].cnt[i];
  37. mk=i;
  38. }
  39. }
  40. if(mx==4 && !a[x].has){
  41. if(mk<res){
  42. res=mk;
  43. ans=x;
  44. }
  45. }
  46. }
  47. return ans;
  48. }
  49. int get(int x){
  50. if(a[x].has && a[x].tm==1){
  51. return 14;
  52. }else{
  53. if(a[x].has){
  54. a[x].tm=1;
  55. }
  56. int mn=0x3f3f3f3f;
  57. for(int i=1;i<=13;i++){
  58. if(!a[x].cnt[i]){
  59. #include <bits/stdc++.h>
  60. using namespace std;
  61. int idx(char c){
  62. if(c=='A'){
  63. return 1;
  64. }else if(c>='2' && c<='9'){
  65. return c-'0';
  66. }else if(c=='D'){
  67. return 10;
  68. }else if(c=='Q'){
  69. return 11;
  70. }else if(c=='J'){
  71. return 12;
  72. }else if(c=='K'){
  73. return 13;
  74. }else if(c=='X'){
  75. return 14;
  76. }
  77. }
  78. int n,k;
  79. struct node{
  80. int cnt[15];
  81. int tm;
  82. bool has;
  83. }a[1005];
  84. char s[10];
  85. int win(){
  86. int ans=0;
  87. int res=0x3f3f3f3f;
  88. for(int x=1;x<=n;x++){
  89. int mx=0;
  90. int mk=0;
  91. for(int i=1;i<=13;i++){
  92. mx=max(mx,a[x].cnt[i]);
  93. if(a[x].cnt[i]>mx){
  94. mx=a[x].cnt[i];
  95. mk=i;
  96. }
  97. }
  98. if(mx==4 && !a[x].has){
  99. if(mk<res){
  100. res=mk;
  101. ans=x;
  102. }
  103. }
  104. }
  105. return ans;
  106. }
  107. int get(int x){
  108. if(a[x].has && a[x].tm==1){
  109. return 14;
  110. }else{
  111. if(a[x].has){
  112. a[x].tm=1;
  113. }
  114. int mn=0x3f3f3f3f;
  115. for(int i=1;i<=13;i++){
  116. if(!a[x].cnt[i]){
  117. continue;
  118. }
  119. mn=min(mn,a[x].cnt[i]);
  120. }
  121. for(int i=1;i<=13;i++){
  122. if(mn==a[x].cnt[i]){
  123. return i;
  124. }
  125. }
  126. }
  127. }
  128. int main(){
  129. //freopen("in.txt","r",stdin);
  130. scanf("%d%d",&n,&k);
  131. for(int i=1;i<=n;i++){
  132. scanf("%s",s);
  133. for(int j=0;j<4;j++){
  134. int x=idx(s[j]);
  135. a[i].cnt[x]++;
  136. }
  137. a[i].has=false;
  138. a[i].tm=0;
  139. }
  140. a[k].has=true;
  141. int cur=k;
  142. while(true){
  143. if(int w=win()){
  144. printf("%d\n",w);
  145. return 0;
  146. }
  147. int nex=get(cur);
  148. int nt=cur%n+1;
  149. a[cur].cnt[nex]--;
  150. a[nt].cnt[nex]++;
  151. if(nex==14){
  152. a[cur].has=false;
  153. a[cur].tm=0;
  154. a[nt].has=true;
  155. a[nt].tm=0;
  156. }
  157. cur=nt;
  158. }
  159. return 0;
  160. }
  161. continue;
  162. }
  163. mn=min(mn,a[x].cnt[i]);
  164. }
  165. for(int i=1;i<=13;i++){
  166. if(mn==a[x].cnt[i]){
  167. return i;
  168. }
  169. }
  170. }
  171. }
  172. int main(){
  173. //freopen("in.txt","r",stdin);
  174. scanf("%d%d",&n,&k);
  175. for(int i=1;i<=n;i++){
  176. scanf("%s",s);
  177. for(int j=0;j<4;j++){
  178. int x=idx(s[j]);
  179. a[i].cnt[x]++;
  180. }
  181. a[i].has=false;
  182. a[i].tm=0;
  183. }
  184. a[k].has=true;
  185. int cur=k;
  186. while(true){
  187. if(int w=win()){
  188. printf("%d\n",w);
  189. return 0;
  190. }
  191. int nex=get(cur);
  192. int nt=cur%n+1;
  193. a[cur].cnt[nex]--;
  194. a[nt].cnt[nex]++;
  195. if(nex==14){
  196. a[cur].has=false;
  197. a[cur].tm=0;
  198. a[nt].has=true;
  199. a[nt].tm=0;
  200. }
  201. cur=nt;
  202. }
  203. return 0;
  204. }

gym102346题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. CSS3 translate导致字体模糊

    今日客户反馈,发现 使用了 translate会导致字体模糊. .media-body-box{ @media all and (min-width: 992px){ position: absolu ...

  2. 我常用的一些linux命令

    之前做过两年的运维,用过很多命令,深切体会到某些linux命令熟练掌握后对效率提升有多大.举个简单的例子,在做了研发后经常会有跑一些数据,对于结果数据的处理,我们的产品同学一般都习惯于用excel做统 ...

  3. 面试必备:Java线程池解析

    前言 掌握线程池是后端程序员的基本要求,相信大家求职面试过程中,几乎都会被问到有关于线程池的问题.我在网上搜集了几道经典的线程池面试题,并以此为切入点,谈谈我对线程池的理解.如果有哪里理解不正确,非常 ...

  4. centos安装oracle11g

    1.1 安装依赖,创建用户和目录 参考http://www.cnblogs.com/gaojun/archive/2012/11/22/2783257.html yum -y install binu ...

  5. Python编程习惯

  6. 【管理学】SMART

  7. 牛客多校第十场 A Rikka with Lowbit 线段树

    链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...

  8. lightoj 1245 Harmonic Number (II)(简单数论)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1245 题意:求f(n)=n/1+n/2.....n/n,其中n/i保留整数 显 ...

  9. WebGL2系列之采样器对象

    前言 在WebGL1中,纹理的图片和采样信息都是写在纹理对象之中. 采样信息告诉GPU如何去读取贴图上图片的信息. 如果我们希望从同一个图片多次读取像素信息,但是每次读取的时候使用的过滤方式不一样, ...

  10. 5分钟理解 SpringBoot 响应式的核心-Reactor

    目录 一.前言 二. Mono 与 Flux 构造器 三. 流计算 1. 缓冲 2. 过滤/提取 3. 转换 4. 合并 5. 合流 6. 累积 四.异常处理 五.线程调度 小结 参考阅读 一.前言 ...