Codeforces Round #222 (Div. 2) ABCD

待我称王封你为后i 2022-08-24 14:14 271阅读 0赞

继续总结做过的CF

比赛链接:http://codeforces.com/contest/378

A Playing with Dice

题意:a,b两个数字,扔一个骰子,求分别与a,b求差的绝对值,谁小就谁赢,相等平局,输出每种情况的个数。

  1. #include <cstdio>
  2. #include <cmath>
  3. int a,b;
  4. int Dis (int k)
  5. {
  6. if (fabs(a-k)<fabs(b-k))
  7. return 1;
  8. else if (fabs(a-k)>fabs(b-k))
  9. return -1;
  10. else
  11. return 0;
  12. }
  13. int main ()
  14. {
  15. scanf("%d%d",&a,&b);
  16. {
  17. int sa=0,sm=0,sb=0;
  18. for (int i=1;i<=6;i++)
  19. {
  20. if (Dis(i)==1)
  21. sa++;
  22. if (Dis(i)==-1)
  23. sb++;
  24. if (Dis(i)==0)
  25. sm++;
  26. }
  27. printf("%d %d %d\n",sa,sm,sb);
  28. }
  29. return 0;
  30. }

B Semifinals
题意:有2场半决赛,各有n个参与者,一共将有n个参与者进入决赛.我们分别在2场比赛中选前k个直接进入决赛,再将剩下的人放在一起排名,选前n-2k个进入决赛.
在k不定的情况下,求哪些人有机会进入决赛,哪些人没有.
思路:k=0和k=n/2分别代表了两种极限情况,其他情况都在这两种之间,分别处理一下即可

  1. #include <cstdio>
  2. #include <cstring>
  3. const int N = 100005;
  4. int n,a[N],b[N];
  5. int an[N],bn[N];
  6. void Deal ()
  7. {
  8. int i;
  9. for (i=0;i<n/2;i++)
  10. an[i]=bn[i]=1;
  11. int ida=0,idb=0;
  12. for (i=0;i<n;i++)
  13. if (a[ida] < b[idb])
  14. an[ida++] = 1;
  15. else
  16. bn[idb++] = 1;
  17. }
  18. int main ()
  19. {
  20. scanf("%d",&n);
  21. memset(an,0,sizeof(an));
  22. memset(bn,0,sizeof(bn));
  23. int i;
  24. for (i=0;i<n;i++)
  25. scanf("%d%d",&a[i],&b[i]);
  26. Deal ();
  27. for (i=0;i<n;i++)
  28. printf("%d",an[i]);
  29. printf("\n");
  30. for (i=0;i<n;i++)
  31. printf("%d",bn[i]);
  32. printf("\n");
  33. return 0;
  34. }

C Maze
题意:给n*m的迷宫,所有’.’为可以通过的地方(给出时所有’.’都四个方向连通),加入k块墙,另所有’.’依然连通,求方案
貌似我想的稍微复杂了些,这里有个简单的思路 http://blog.csdn.net/wangyuquanliuli/article/details/17675801

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;
  5. #define max(a,b) ((a)>(b)?(a):(b))
  6. const int N=505;
  7. struct Point
  8. {
  9. int x,y,step;
  10. };
  11. char map[N][N];
  12. int id[N][N]; //记录每个位置被BFS到时的距离
  13. bool visit[N][N];
  14. int cal[N*N]; //记录每种距离有多少个点
  15. int m,n,k;
  16. int dx[]={1,-1,0,0};
  17. int dy[]={0,0,1,-1};
  18. int OK (int x,int y)
  19. {
  20. return x>=0 && x<n && y>=0 &&y<m && map[x][y]=='.' && visit[x][y]==false;
  21. }
  22. int BFS (int sx,int sy)
  23. {
  24. Point top,t;
  25. queue <Point> Q;
  26. memset(visit,false,sizeof(visit));
  27. memset(id,0,sizeof(id));
  28. top.step=0;
  29. top.x=sx;
  30. top.y=sy;
  31. Q.push(top);
  32. visit[top.x][top.y]=true;
  33. int m=0; //记录BFS的最远距离
  34. while (Q.empty()==false)
  35. {
  36. top=Q.front();
  37. Q.pop();
  38. for (int i=0;i<4;i++)
  39. {
  40. t.x=top.x+dx[i];
  41. t.y=top.y+dy[i];
  42. t.step=top.step+1;
  43. if (OK(t.x,t.y))
  44. {
  45. visit[t.x][t.y]=true;
  46. id[t.x][t.y]=t.step;
  47. m=max(m,t.step);
  48. cal[t.step]++;
  49. Q.push(t);
  50. }
  51. }
  52. }
  53. return m;
  54. }
  55. int main ()
  56. {
  57. scanf("%d%d%d",&n,&m,&k);
  58. int i,j;
  59. for (i=0;i<n;i++)
  60. scanf("%s",map[i]);
  61. int sx,sy;
  62. cal[0]++;
  63. bool flag=false;
  64. for (i=0;i<n;i++)
  65. {//找第一个'.'
  66. for (int j=0;j<m;j++)
  67. if (map[i][j]=='.')
  68. {
  69. sx=i;sy=j;
  70. flag=true;
  71. break;
  72. }
  73. if (flag)
  74. break;
  75. }
  76. int limit=BFS(sx,sy);
  77. if (limit == 0)
  78. {
  79. for (i=0;i<n;i++)
  80. printf("%s\n",map[i]);
  81. return 0;
  82. }
  83. int sum=0;
  84. for (i=limit;i>=0;i--)
  85. {//记录在哪些距离上的点可以被填充
  86. if (sum+cal[i]<=k)
  87. sum+=cal[i];
  88. else break;
  89. }
  90. int start=++i,ss=k-sum;//ss记录还需要填充多少点
  91. for (i=0;i<n;i++)
  92. for (j=0;j<m;j++)
  93. {
  94. if (id[i][j]>=start)
  95. map[i][j]='X';
  96. if (ss>0 && id[i][j]==start-1)
  97. {
  98. map[i][j]='X';
  99. ss--;
  100. }
  101. }
  102. for (i=0;i<n;i++)
  103. printf("%s\n",map[i]);
  104. return 0;
  105. }

D Preparing for the Contest
有m个bug,每个bug有级别,有n个人去修复bug,每个人有能力等级和需求.现在总共有s个费用.求最少天数完成的方法,并且输出方案.
思路:二分+贪心+优先队列优化

  1. #include <cstdio>
  2. #include <queue>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 100005;
  6. int n,m,s;
  7. int ans[N];
  8. struct Student
  9. {
  10. int b,c,id;
  11. bool operator < (Student b) const
  12. {//花费小的优先
  13. return c>b.c;
  14. }
  15. }stu[N];
  16. struct Bug
  17. {
  18. int a,id;
  19. bool operator < (Bug b) const
  20. {
  21. return a<b.a;
  22. }
  23. }bug[N];
  24. int cmp (Student a, Student b)
  25. {
  26. return a.b > b.b;
  27. }
  28. void solve (int time)
  29. {
  30. int limit=s,cnt=0;
  31. priority_queue <Student> Q;
  32. for (int i=m-1;i>=0;i-=time)
  33. {
  34. while (stu[cnt].b >= bug[i].a && cnt != n)
  35. Q.push(stu[cnt++]);
  36. Student t = Q.top();
  37. Q.pop();
  38. limit -= t.c;
  39. int e=i-time+1;
  40. if (e<0) e=0;
  41. for (int j=i; j>=e ;j--)
  42. ans[bug[j].id] = t.id;
  43. }
  44. }
  45. bool OK (int time)
  46. {
  47. int limit=s, cnt=0;
  48. priority_queue<Student> Q;
  49. for (int i=m-1;i>=0;i-=time)
  50. {
  51. while (stu[cnt].b >= bug[i].a && cnt != n)
  52. Q.push(stu[cnt++]);//将所有能解决该问题的学生放入优先队列,花费小的优先
  53. if (Q.empty()) return false;
  54. Student t = Q.top();
  55. Q.pop();
  56. if (limit < t.c) return false;
  57. limit -= t.c;
  58. }
  59. return true;
  60. }
  61. void Deal ()
  62. {
  63. if (OK(m)==false)
  64. {
  65. printf("NO\n");
  66. return;
  67. }
  68. int low=0,high=m,tmp;
  69. /* while (low < high) //这么写也可以
  70. {
  71. int mid=(low+high)>>1;
  72. if (OK(mid)) high=mid;
  73. else low=mid+1;
  74. }
  75. solve(high);
  76. */
  77. while (low <= high)
  78. {
  79. int mid=(low+high)>>1;
  80. if (OK(mid)) high=mid-1,tmp=mid;
  81. else low=mid+1;
  82. }
  83. solve(tmp);
  84. printf("YES\n");
  85. for (int i=0;i<m;i++)
  86. printf(i==m-1?"%d\n":"%d ",ans[i]+1);
  87. }
  88. int main ()
  89. {
  90. int i;
  91. scanf("%d%d%d",&n,&m,&s);
  92. for (i=0;i<m;i++)
  93. {
  94. scanf("%d",&bug[i].a);
  95. bug[i].id=i;
  96. }
  97. for (i=0;i<n;i++)
  98. {
  99. scanf("%d",&stu[i].b);
  100. stu[i].id=i;
  101. }
  102. for (i=0;i<n;i++)
  103. scanf("%d", &stu[i].c);
  104. sort(bug, bug+m); //按照等级降序排序
  105. sort(stu, stu+n, cmp); //按照能力升序排序
  106. Deal ();
  107. return 0;
  108. }

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读