思路:
定义一个数组存这个数最大的质因数。
如何存,枚举每一个小于 nnn 的质数,再枚举它的倍数,但是在枚举倍数时要注意如果第二个数字大于了第一个数字且第二个数字是质数那么先跳过,且第一个数字乘第二个数字要是大于 nnn 那么退出这一层循环写进判断条件里,代码如下。
for(long long i=2;i<=n;i++){ if(zs(i))//注意 i 要是质数 for(long long j=1;j*i<=n;j++){//枚举 i 的倍数 if(j>i&&zs(j))continue;// 如果 j 大于 i 且 j 是质数 那么说明 i*j 这个数的最大质因数不是 i 直接跳过后面再赋值 bj[j*i]=i; //cout<<i*j<<"\n";// 测试 } else continue;//i 不是质数跳过 }
标记好了后,定义一个存的变量变量赋值为一,因为虽然一没有质因数但是还是要加上,然后枚举从二到 nnn 中有多少个的最大质因数 ...
思路:
规律:观察后发现答案是每种邮票的张数除以现在的人数后省去小数部分后再次乘以人数。
每种邮票的张数除以现在的人数后省去小数部分就是可以分成几组,组不能是小数,因为题中说申请人都必须从该城市获得相同数量的邮票所以不能分开。
再乘以人数就是求分出了几张邮票。
一开始想用桶但发现数据太大了开不了数组,所以用了 map 但是用了 map 后发现不能满分于是观察了下发现只要有一个的邮票发出总和为零时,后面的也都是零,这样过后发现还是不可以满分,再次观察题目发现是不需要排序的,所以把 map 改成 unordered_map 就这样了吗,没有,再次观察可以发现当一个邮票的张数已经小于现在的人数了,那么不管怎么样,后面都不可以让答案增加了,所以直接删去,这样就可以了。
代码:
#include<bits/stdc++.h>using namespace std;unordered_map<int,int>mp;int n;int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin> ...
思路:
使用结构体快排,自己写判断函数,按照题目给出的进行判断,判断后历遍一次结构体数组,把学生的排名赋值,然后按照输入的顺序再排序一次最后输出就可以了。
如何赋值排名,如果和上一个人的排名是相同的就赋值为上一个人的排名,如果不是直接赋值为 iii。
代码:
// 以下代码与思路完全相同 // 本代码已经提交测试并且已经 AC #include<bits/stdc++.h>using namespace std;int n;struct node{ long long sum/* 总和 */,chinese/* 语文 */,math/* 数学 */,english/*english 可以不定义在结构体里 */; long long pm/* 排名 */,bh/* 编号 */;}stud[10002]; bool cmp(node x,node y){// 排序排名降序 if(x.sum!=y.sum)return x.sum>y.sum;// 判断总分 else{// 如果总分相同 if(x.chinese+x.ma ...
思路:
先通过此程序列出部分立方根向下取整的情况。
#include<bits/stdc++.h>using namespace std;long long s[20000000];long long jia(long long x,long long y){ long long sum=0; for(int i=x+1;i<=y;i++)sum+=cbrt(i); return sum;}int main(){ long long x,y=0; long long last=0,las=0; for(int i=1;i<=1e6;i++){ s[i]=s[i-1]+cbrt(i); if(s[i]-s[i-1]!=last)cout<<i<<" "<<s[i]<<"\n",last=s[i]-s[i-1]; } return 0;}
可以发现每次当 iii 为某数的立方时,立方根向下取整的结果会增加一 ...
思路:
按照题目模拟,题目要求我们判断加法等式是否成立。
那么如何输入,可以先输入一个数字,再输入字符,再输入数字,再输入字符,再输入数字,然后判断第一个数字加第二个数字是否等于第三个数字就可以了。
代码:
#include<bits/stdc++.h>using namespace std;int T,a,b,c;int main(){ cin>>T;char fuh; while(T--){ cin>>a>>fuh>>b>>fuh>>c; if(a+b!=c)cout<<"Wrong!\n"; else cout<<"Right!\n"; } return 0;}
思路:
观察题目描述发现当 hhh 等于三时,一共分成了三行。
先看第一行,打乱前的第一第五第九个字符分别变成了打乱后的第一二三个字符,相邻两个字符之间原本相差 h−1h-1h−1 的两倍。
再看第二行,首行和尾行的间隔依旧不变,假设列数为 iii,会有两种情况:
若当前数为第二行的奇数个字符的时候,下一个字符是 h−ih-ih−i 的两倍。
若当前数为第二行的偶数个字符的时候,下一个字符是 i−1i-1i−1 的两倍。
第 hhh 行与第一行是一样的。
再画个只有数字的图来验证我们的思路。
观察后我们可以发现,当 hhh 为三时,一共分成了三行,打乱前的一、五、九分别变成了打乱后的第一、二、三个数,相邻两个数之间相差四也就是 h−1h-1h−1 的两倍,第 hhh 行与第一行相同。再看第二行你会发现,首行和尾行的间隔不变假设列数为 iii,当前数为第二行的第奇数个数的时候,下一个数字是 h−ih-ih−i 的两倍,若当前数为第二行的第偶数个数的时候,下一个数字是 i−1i-1i−1 的两倍。而且每一行的第一个数字就是这一行的行数。
与我们上面的思路相同,所以可以写成代码。
...
思路:
通过画图可知编号为 iii 的人的正对面的人的编号为 i+n/2i+n/2i+n/2,前提是 iii 小于等于 nnn 的一半。
得知了编号为 iii 的人和他的正对面的人的编号就可以直接判断他们帽子的号码是不是相同的就可以了。
已提交测试。
完整代码:
#include<bits/stdc++.h>#define LL long long#define CPPname using namespace stdCPPname;LL n;const int MAX=1000010;LL a[MAX];int main(){ cin>>n; LL ans=0; for(int i=1;i<=n;i++)cin>>a[i]; const int c=n/2; for(int i=1;i<=n/2;i++){ if(a[i]==a[i+c])ans+=2; //cout<<i<<" "<<i+n/2& ...
思路:
先输入,然后模拟,当 Yobi 的大小大于等于 Dusa 时输出 Dusa 现在的大小,并结束。
因为题目没有告诉我们有几个 Yobi 所以这样输入:
while(cin>>a[cnt++]);
代码:
#include<bits/stdc++.h>#define LL long long#define CPPname using namespace stdCPPname;LL Dusa;int cnt=1,a[200010];int main(){ int d;cin>>d; Dusa=d; while(cin>>a[cnt++]); for(int i=1;i<cnt;i++){ if(Dusa>a[i])Dusa+=a[i]; else{ cout<<Dusa; return 0; } } return 0;}
思路:
使用桶进行储存,然后从最大的分数从小历遍,当现在是第三个有值的,这就是铜牌,然后输出分数和人数就可以了。
代码:
#include<bits/stdc++.h>#define LL long long#define CPPname using namespace stdCPPname;int tong[76],n,tamp;int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>tamp; tong[tamp]++;// 使用桶进行储存 } tamp=0;//计算是第几大的 for(int i=75/* 题目中保证每个分数在 75 以下 */;i>=0/* 题目中保证每个分数在 0 以上 */;i--){ if(tong[i]!=0)tamp++; if(tamp==3){ cout<<i<<" "<<tong[i]; return 0; } &# ...
思路:
先看题判断其中重的字母和轻的字母是否满足交替出现,由此我们可以得出要先求出是奇数位的字母是重的,还是偶数位的字母重的。
注意,称一个字母是重的当且仅当它在字符串中出现了超过一次,是在字符串里出现了几次,而不是在它这次出现前出现了几次。
求出是奇数位的字母是重的,还是偶数位的字母重的,就好写了,只需要在判断的时候看现在历遍的字母的下标是不是需要重的,如果在不需要重的时候重了或在要重的地方没有重就输出 F 就可以了。
最后还有一个点,特判当字符串长度为二的时候,直接输出 F 就可以了。
整体思路就这么简单,但是坑多。
代码:
#include<bits/stdc++.h>using namespace std;long long T,N;string a;long long cnt[27]={0};int main(){ cin>>T>>N; while(T--){ cin>>a; int jo=9; memset(cnt,0,sizeof(cnt)); for(int i=0;i ...