20220522进阶TEST-1答案与解析
A - Lucky?
题意:给你t个数,分别判一下这t个数是不是前三位的和等于后三位的和
方案:
#include<bits/stdc++.h> using namespace std; int n; int sum1[10000],sum2[10000]; int main(){ cin>>n; for(int i=1;i<=n;i++){ string str; cin>>str; sum1[i]=str[0]-'0'+str[1]-'0'+str[2]-'0'; sum2[i]=str[3]-'0'+str[4]-'0'+str[5]-'0'; } for(int i=1;i<=n;i++){ if(sum1[i]==sum2[i]) puts("YES"); else puts("NO"); } return 0; }
B - Division?
题意:给你t个数,让你分别判一下这t个数分别在哪个范围内并且输出所在范围的编号
解法:
#include<bits/stdc++.h> using namespace std; int n; int flag[100000]; int a[100000]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]>=1900){ flag[i]=1; } else if(a[i]>=1600){ flag[i]=2; } else if(a[i]>=1400){ flag[i]=3; } else{ flag[i]=4; } } for(int i=1;i<=n;i++){ cout<<"Division"<<" "<<flag[i]<<endl; } return 0; }
C - Vasya and Coins
题意:给你a个1块钱的硬币和b个两块钱的硬币,让你求出最小的组合不出来的价钱,这里我们可以总结出来一个公式:s=2b+a+1(当a不等于0时),若a等于0,那么b最小不能组合出来的价格就是1(因为只用b组出来的一定是偶数,而最小的奇数就是1)
解法:
#include <bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ int a,b; cin>>a>>b; int s=b*2+a+1; if(a==0) cout<<"1"<<endl; else cout<<s<<endl; } return 0; }
D - 迷宫问题
E - 全排列
题意:让你做出给出的所有数直到0的全排列,这里我们使用递归的方法来实现全排列时的函数,因为输入数量不定,所以可以用vector来解决。首先考虑终止条件(也是在不用排列的时候),如果不是是终止条件,那么i=1,只输出没排列的数。如果是的话,也就不用排列了。再往后,用vis这个数组来当标签(当vis[i]1时遍历过当vis[i]0时就是没有遍历过),判断这个数有没有遍历过,如果没有遍历过,那么先把标签打成遍历过的,然后压入i并且遍历i,一直这样下去,等到最后一次跳入并成功跳出f(a+1,b);这个此时已经不再是递归的函数后,再打上没有处理过的标签,表明在这一轮大遍历中已经处理完了,在下一次大遍历时还是以未被遍历过的身份出现。
解法:
#include<bits/stdc++.h> using namespace std; int vis[999]; vector<int>g; void f(int a,int b){ if(a==b){ printf("%d",g[0]); } for(int i=1;i<g.size();i++) printf(" %d",g[i]); printf("\n"); return ; } for(int i=1;i<=b;i++){ if(!vis[i]){ vis[i]=1; g.push_back(i);//压入i f(a+1,b); vis[i]=0; g.pop_back();//弹出i } } } int main(){ while(1){ int b; cin>>b; if(b==0){ break; } f(0,b); } return 0; }
F - 八皇后问题
题目思路:
在放每一个皇后时,分别判一下这里可不可以放,这里我们可以使用一下在函数中的斜率
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define N 100 using namespace std; int a[N][N],b[N]; //数组a存放八皇后的所有可能 数组b存放一遍搜索的八皇后的可能 int vis[N]; //标记列上是否已经有皇后 int s; //八皇后的所有可能 int check(int step) { //如果两列上皇后的行的差=列的差 或者 两列上皇后的行相同,说明放的位置错误 for(int i=1;i<=step-1;i++) if((abs(b[i]-b[step])==abs(i-step))) return 0; return 1; } void dfs(int step) //搜索行 { if(step==8+1) { s++; for(int i=1; i<=8; i++) a[s][i]=b[i]; return; } for(int i=1; i<=8; i++) //循环判断每一列上是否可以放皇后 { if(vis[i]==0) //说明此列上未放过皇后 { b[step]=i; //将step行的i列上放上皇后 if(check(step)) //检查是否符合八皇后 { vis[i]=1; dfs(step+1); vis[i]=0; } } } } int main() { dfs(1); for(int t=1; t<=s; t++) { printf("No. %d\n",t); for(int i=1; i<=8; i++) { for(int j=1; j<=8; j++) { if(a[t][j]==i) cout<<"1 "; else cout<<"0 "; } cout<<endl; } } return 0; }
G - Equal Candies
思路:给你t组分别有n个数的数组(每组的n不相等),让你分别把其中的除最小值以外的所有数与最小值的差加在一起的和求出并且输出出来
复习:sort排序函数用法
对数组A的0~n-1元素进行升序排序,只要写sort(A,A+n)即可;对于向量V也一样,sort(v.begin(),v.end())即可。
sort不只是能像上面那样简单的使用,我们可以对sort进行扩展,关键就在于第三个参数<cmp比较函数>,我们想降序排列,或者说我不是一个简简单单的数组,而是结构体、类怎么办。
//情况一:数组排列 int A[100]; bool cmp1(int a,int b)//int为数组数据类型 { return a>b;//降序排列 //return a<b;//默认的升序排列 } sort(A,A+100,cmp1);
//情况二:结构体排序 Student Stu[100]; bool cmp2(Student a,Student b) { return a.id>b.id;//按照学号降序排列 //return a.id<b.id;//按照学号升序排列 } sort(Stu,Stu+100,cmp2);
解法:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll t; ll n; ll sum[1010]; ll a[10000010]; int main(){ cin>>t; for(ll j=1;j<=t;j++){ sum[j]=0; cin>>n; for(ll i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n); for(ll i=2;i<=n;i++){ sum[j]+=a[i]-a[1]; } } for(ll i=1;i<=t;i++){ cout<<sum[i]<<endl; } return 0; }
注意:因为原题给的ai的范围时1<=ai<=107所以所有的变量都要开long long,在比赛时可能会浪费时间,所以把它变成
typedef long long ll;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异