当前位置:   article > 正文

Educational Codeforces Round 109 A B C D 题解

educational codeforces round 109

A. Potion-making

题意

给出w,要求配出含量为w%的溶液,每次只能加一份水或者溶质,最少要几次才可以实现

思路

  • 配比即为w:100-w,化简即可

时间复杂度

O(T)

参考代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<map>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. using namespace std;
  11. const int maxn=1e5+10;
  12. int t,n,m,num[maxn];
  13. int main() {
  14. scanf("%d",&t);
  15. while(t--){
  16. scanf("%d",&n);
  17. if(n==0 || n==100) {
  18. printf("1\n");
  19. continue;
  20. }
  21. m=100-n;
  22. int gcd=__gcd(n,m);
  23. printf("%d\n",n/gcd+m/gcd);
  24. }
  25. }

 

B. Permutation Sort

题意

给出数组A,保证A是1到n的全排列,每次可以选择一个长度小于n的连续子串随意重排,最少操作几次才可以恢复成全排列

思路

  • 每次排列尽可能多的元素
  • 开始显然要尽可能把1和n排列正确
  • 即:遇到n在开头且1在结尾,要排三次:把1挪走,把1归位同时挪走n,把n归位
  • 遇到1不在开头且n不在结尾,要排两次:把1归位,把n归位
  • 剩下情况移动一次即可

时间复杂度

O(Tn)

参考代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<map>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. using namespace std;
  11. const int maxn=1e5+10;
  12. int t,n,m,num[maxn],f[maxn];
  13. int main() {
  14. scanf("%d",&t);
  15. while(t--){
  16. scanf("%d",&n);
  17. for(int i=1;i<=n;i++){
  18. scanf("%d",num+i);
  19. }
  20. int ans=0,f=1;
  21. for(int i=1;f && i<=n;i++) if(num[i]!=i) f=0;
  22. if(f) {
  23. printf("0\n");
  24. continue;
  25. }
  26. if(num[1]!=1) ans++;
  27. if(num[n]!=n) ans++;
  28. if(num[1]==n && num[n]==1) ans++;
  29. printf("%d\n",max(ans,1));
  30. }
  31. }

 

C. Robot Collisions

题意

数轴上有一堆机器人,向左或右走,每分钟走一格,到头会回头,在整数点相遇就会爆炸,请问每个机器人啥时候爆炸

思路

  • 首先区分奇偶性与方向,按照每种奇偶性与方向暴力分类讨论即可

时间复杂度

O(Tn)

参考代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<map>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. using namespace std;
  11. const int maxn=3e5+10;
  12. struct robot{
  13. int pos,id,dir;
  14. }a[maxn];
  15. bool cmp(robot a,robot b){ return a.pos<b.pos;}
  16. int ans[maxn],n,m,t;
  17. int main(){
  18. scanf("%d",&t);
  19. while(t--){
  20. scanf("%d%d",&n,&m);
  21. for(int i=1;i<=n;i++){
  22. scanf("%d",&a[i].pos);
  23. a[i].id=i;
  24. }
  25. for(int i=1;i<=n;i++){
  26. string st;
  27. cin>>st;
  28. a[i].dir=(st[0]=='R');
  29. }
  30. sort(a+1,a+1+n,cmp);
  31. vector<pair<int,int> > l0,l1,r0,r1;
  32. for(int i=1;i<=n;i++){
  33. if(a[i].pos&1){
  34. if(a[i].dir)
  35. r1.push_back(make_pair(a[i].pos,a[i].id));
  36. else
  37. if(r1.size()){
  38. ans[a[i].id]=ans[r1[r1.size()-1].second]=(a[i].pos-r1[r1.size()-1].first)/2;
  39. r1.pop_back();
  40. } else
  41. l1.push_back(make_pair(a[i].pos,a[i].id));
  42. }else{
  43. if(a[i].dir)
  44. r0.push_back(make_pair(a[i].pos,a[i].id));
  45. else
  46. if(r0.size()){
  47. ans[a[i].id]=ans[r0[r0.size()-1].second]=(a[i].pos-r0[r0.size()-1].first)/2;
  48. r0.pop_back();
  49. } else
  50. l0.push_back(make_pair(a[i].pos,a[i].id));
  51. }
  52. }
  53. for(int i=r1.size()&1;i<r1.size();i+=2)
  54. ans[r1[i].second]=ans[r1[i+1].second]=(2*m-r1[i].first-r1[i+1].first)/2;
  55. for(int i=r0.size()&1;i<r0.size();i+=2)
  56. ans[r0[i].second]=ans[r0[i+1].second]=(2*m-r0[i].first-r0[i+1].first)/2;
  57. for(int i=0;i<l1.size();i+=2){
  58. if(i==l1.size()-1)break;
  59. ans[l1[i].second]=ans[l1[i+1].second]=(l1[i].first+l1[i+1].first)/2;
  60. }
  61. for(int i=0;i<l0.size();i+=2){
  62. if(i==l0.size()-1)break;
  63. ans[l0[i].second]=ans[l0[i+1].second]=(l0[i].first+l0[i+1].first)/2;
  64. }
  65. if(r1.size()&1)
  66. if(l1.size()&1)
  67. ans[r1[0].second]=ans[l1[l1.size()-1].second]=(m+m-r1[0].first+l1[l1.size()-1].first)/2;
  68. else
  69. ans[r1[0].second]=-1;
  70. else
  71. if(l1.size()&1)
  72. ans[l1[l1.size()-1].second]=-1;
  73. if(r0.size()&1)
  74. if(l0.size()&1)
  75. ans[r0[0].second]=ans[l0[l0.size()-1].second]=(m+m-r0[0].first+l0[l0.size()-1].first)/2;
  76. else
  77. ans[r0[0].second]=-1;
  78. else
  79. if(l0.size()&1)
  80. ans[l0[l0.size()-1].second]=-1;
  81. for(int i=1;i<=n;i++) printf("%d ",ans[i]);
  82. printf("\n");
  83. }
  84. }

 

D. Armchairs

题意

一些位置上有人,每分钟可以走一格,不可以同时走,要把所有人移到不同位置上,保证有解,请问最少要多少时间?

思路

  • 看到5000的数据范围,想到暴力dp
  • 每个位置,如果本身有人,一定直接结束,不能接受
  • 如果本身每人,可以考虑接受所有人,暴力枚举即可

时间复杂度

O(n^2)

参考代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<map>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. #include<list>
  11. using namespace std;
  12. const int maxn=5000+10;
  13. int n,a[maxn],last,f[maxn][maxn];//f[i][j]表示在i这个位置的人安排到j位置时最小代价
  14. int main(){
  15. scanf("%d",&n);
  16. memset(f,0x3f,sizeof(f));
  17. for(int i=1;i<=n;i++) scanf("%d",a+i);
  18. for(int i=0;i<=n;i++) f[0][i]=0;
  19. for(int i=1;i<=n;i++) if(a[i]) {
  20. for(int j=1;j<=n;j++){
  21. f[i][j]=f[i][j-1];
  22. if(!a[j])
  23. f[i][j]=min(f[i][j],f[last][j-1]+abs(j-i));
  24. }
  25. last=i;
  26. }
  27. printf("%d\n",f[last][n]);
  28. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/698320
推荐阅读
相关标签
  

闽ICP备14008679号