第七届传智杯初赛+重现赛总结

一给  金牌会员 | 2024-12-22 00:18:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

重现赛题目网站:(2条未读私信) 牛客比赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客比赛OJ
1.吃糖果(B组、C组)

  
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,k,count1=0,sum1=0;
  5. int a[200010];
  6. signed main()
  7. {
  8.         cin>>n>>k;
  9.         for(int i=0;i<n;i++)
  10.         {
  11.                 cin>>a[i];
  12.         }
  13.         sort(a,a+n);
  14.         for(int i=0;i<n;i++)
  15.         {
  16.                 sum1+=a[i];
  17.                 if(sum1<=k)
  18.                 {
  19.                         count1++;
  20.                 }
  21.                 else
  22.                 {
  23.                         break;
  24.                 }
  25.         }
  26.         cout<<count1<<endl;
  27.         return 0;
  28. }
复制代码
2.汤姆和杰瑞(A组、C组)

  
  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. signed main()
  5. {
  6.         int a,b;
  7.         cin>>a>>b;
  8.         cout<<b-a<<" "<<b<<endl;
  9.         return 0;
  10. }
复制代码
3.游游的重组偶数(A组、B组、C组)

   发现偶数规律,如果用整形重组注意前导0的情况 
   
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int q;
  5. signed main()
  6. {
  7.         cin>>q;
  8.         while(q--)
  9.         {
  10.                 int x;
  11.                 cin>>x; //变为偶数,数位存在偶数就行
  12.                 int a=0,x1=0,temp=0;;
  13.                 bool found=false;
  14.                 string s,s1;
  15.                 while(x>0)
  16.                 {
  17.                         a=x%10;
  18.                         x/=10;
  19.                         if(a%2==0)
  20.                         {
  21.                                 found=true;
  22.                                 temp=a;
  23.                                 break;
  24.                         }
  25.                         x1=x1*10+a;
  26.                         s=to_string(x1);
  27.                 }
  28.                 if(x!=0)
  29.                 {
  30.                         s1=s+to_string(x)+to_string(temp);       
  31.                 }
  32.                 else
  33.                 {
  34.                         s1=s+to_string(temp);
  35.                 }
  36.                 int temp1=0;
  37.                 for(int i=0;i<s1.size();i++)
  38.                 {
  39.                         temp1=temp1*10+(int)(s1[i]-'0');
  40.                 }
  41.                 if(found)
  42.                 {
  43.                         cout<<temp1<<endl;       
  44.                 }
  45.                 else
  46.                 {
  47.                         cout<<-1<<endl;
  48.                 }
  49.         }
  50.         return 0;
  51. }
复制代码
4.开心还是惆怅(B组、C组) 

   注意处理空格字符串的方式:getline(cin,string);
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. string str;
  5. signed main()
  6. {
  7.         getline(cin,str);
  8.         int s1=0,s2=0;
  9.         for(int i=0;i<str.size();i++)
  10.         {
  11.                 if(str[i]==':'&&str[i+1]=='-'&&str[i+2]=='(')
  12.                 {
  13.                         s1++;
  14.                 }
  15.                 else if((str[i]==':'&&str[i+1]=='-'&&str[i+2]==')'))
  16.                 {
  17.                         s2++;
  18.                 }
  19.         }
  20.         if((s1==0)&&(s2==0))
  21.         {
  22.                 cout<<"None"<<endl;
  23.         }
  24.         else if(s1<s2)
  25.         {
  26.                 cout<<"Happy"<<endl;
  27.         }
  28.         else if(s1==s2)
  29.         {
  30.                 cout<<"Just so so"<<endl;
  31.         }
  32.         else if(s1>s2)
  33.         {
  34.                 cout<<"Sad"<<endl;
  35.         }
  36.         return 0;
  37. }
复制代码
5.小欧的平面连线(A组、B组、C组)

   规律题,交织对角象限权值2,交织单坐标权值1
  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. int n,sum=0;
  5. signed main()
  6. {
  7.         int x,y,sign1=0,sign2=0,sign3=0,sign4=0;
  8.         cin>>n;
  9.         while(n--)
  10.         {
  11.                 cin>>x>>y;
  12.                 if(x>=0 && y>=0)
  13.                 {
  14.                         sign1++; //一象限
  15.                 }
  16.                 else if(x<=0 && y>=0)
  17.                 {
  18.                         sign2++;
  19.                 }
  20.                 else if(x<=0 && y<=0)
  21.                 {
  22.                         sign3++;
  23.                 }
  24.                 else
  25.                 {
  26.                         sign4++;
  27.                 }
  28.         }
  29.         int temp,temps,temp1,temp2;
  30.         //1,3象限配对  2,4象限配对
  31.         temp=min(sign1,sign3);
  32.         temp1=max(sign1,sign3)-temp; //1,3象限剩余某单个象限点
  33.         temps=min(sign2,sign4);
  34.         temp2=max(sign2,sign4)-temps;
  35.         sum=(temp+temps)*2;
  36.         sum+=min(temp1,temp2); //权值为1配对
  37.         cout<<sum<<endl;
  38.         return 0;
  39. }
复制代码
6.小红的四子棋(A组、B组、C组)

   遍历数组,注意if (a[j] == '.') continue; // 忽略
  只需要判定有4个棋子相连即可,更多无意义
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,m;
  5. char a[110][110];
  6. signed main()
  7. {
  8.         cin>>n>>m;
  9.         for(int i=1; i<=n; i++)
  10.         {
  11.                 for(int j=1; j<=m; j++)
  12.                 {
  13.                         cin>>a[i][j];
  14.                 }
  15.         }
  16.         char a1='1';
  17.         for(int i=1; i<=n; i++)
  18.         {
  19.                 for(int j=1; j<=m; j++)
  20.                 {
  21.                         if (a[i][j] == '.') continue; // 忽略
  22.                         if(a[i][j]==a[i+1][j] && a[i][j]==a[i+2][j] && a[i][j]==a[i+3][j])
  23.                         {
  24.                                 if(a[i][j]=='r')
  25.                                 {
  26.                                         cout<<"kou"<<endl;
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         cout<<"yukari"<<endl;
  31.                                 }
  32.                                 return 0;
  33.                         }
  34.                         else if(a[i][j]==a[i][j+1] && a[i][j]==a[i][j+2] && a[i][j]==a[i][j+3])
  35.                         {
  36.                                 if(a[i][j]=='r')
  37.                                 {
  38.                                         cout<<"kou"<<endl;
  39.                                 }
  40.                                 else
  41.                                 {
  42.                                         cout<<"yukari"<<endl;
  43.                                 }
  44.                                 return 0;
  45.                         }
  46.                         else if(a[i][j]==a[i+1][j+1] && a[i][j]==a[i+2][j+2] && a[i][j]==a[i+3][j+3])
  47.                         {
  48.                                 if(a[i][j]=='r')
  49.                                 {
  50.                                         cout<<"kou"<<endl;
  51.                                 }
  52.                                 else
  53.                                 {
  54.                                         cout<<"yukari"<<endl;
  55.                                 }
  56.                                 return 0;
  57.                         }
  58.                         else if(a[i][j]==a[i+1][j-1] && a[i][j]==a[i+2][j-2] && a[i][j]==a[i+3][j-3] )
  59.                         {
  60.                                 if(a[i][j]=='r')
  61.                                 {
  62.                                         cout<<"kou"<<endl;
  63.                                 }
  64.                                 else
  65.                                 {
  66.                                         cout<<"yukari"<<endl;
  67.                                 }
  68.                                 return 0;
  69.                         }
  70.                 }
  71.         }
  72.         cout<<"to be continued"<<endl;
  73.         return 0;
  74. }
复制代码
7.小红的数组利用(A组、B组) 

   二分思想,二分寻找 mid:数组尽可能小的最大值 ,注意可以是负数
  1. #include<iostream>
  2. #define int long long
  3. using namespace std;
  4. int a[100010];
  5. int n,k,x;
  6. bool check(int mid)
  7. {
  8.         int sum=0; //操作次数
  9.         for(int i=1; i<=n; i++)
  10.         {
  11.                 if(a[i]>mid) //计算将a[i]降到mid需要的操作次数
  12.                 {
  13.                         sum+=(a[i]-mid+x-1)/x; //总共操作次数
  14.                 }
  15.         }
  16.         return sum<=k; //非必等于k次,尽可能小的最大值(小于k次就能实现,剩余操作只要不去操作数组最大值就行)
  17. }
  18. signed main()
  19. {
  20.         cin>>n>>k>>x;
  21.         for(int i=1; i<=n; i++) cin>>a[i];
  22.         int l = -1e14, r = 1e9, mid, ans;
  23.         while(l<=r)
  24.         {
  25.                 mid=(l+r)/2;
  26.                 if(check(mid)) //mid:数组尽可能小的最大值
  27.                 {
  28.                         ans=mid;
  29.                         r=mid-1; //寻找更小的mid
  30.                 }
  31.                 else
  32.                 {
  33.                         l=mid+1;
  34.                 }
  35.         }
  36.         cout<<ans<<endl;
  37.         return 0;
  38. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表