思路:
观察题目描述发现当 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 ...
思路:
首先看题,让我们求迷宫 mmm 可以直接到达其他的迷宫有多少个,有多少迷宫可以直接到达 mmm 号迷宫,和这些迷宫的总和。
先看迷宫 mmm 可以直接到达其他的迷宫,是什么意思呢?
其实就是让我们看当历遍的迷宫是 mmm 时有多少个为真。
由此得出代码:
for(int i=1;i<=n;i++){ if(jz[m][i]==1){ // 我们只用查看 m 迷宫有多少个 1 sum1++; }}
然后我们看多少迷宫可以直接到达 mmm 号迷宫,这又是什么意思呢?
其实就是查看有多少个迷宫的 mmm 也就是 jz[i][m]jz[i][m]jz[i][m] 为真。
由此得出代码:
for(int i=1;i<=n;i++){ if(jz[i][m]==1)sumzj++;}
让我们看一下这两份代码循环的条件是不是相同的?
是对吧,由此合并两份代码:
for(int i=1;i<=n;i++){ if(jz[m][i]==1){ sum1++; } if(jz[ ...
题目
思路:
因为题中给出要使奇数组的编号之和为偶数偶数组的编号之和为奇数。
所以我们只需要知道编号的奇偶性。
所以我们可以先统计出奇数和偶数各有多少个。
然后会出现两种情况:奇数多,偶数多。
因为小学学过:奇数加奇数等于偶数,偶数加偶数等于偶数,奇数加偶数等于奇数。
所以可以得出解决方案:
奇数多时,将两个奇数相加变成偶数,减少奇数的数量,增加偶数的数量。
偶数多时,将偶数和奇数相加变成奇数,减少偶数的数量,增加奇数的数量。
代码
#include <bits/stdc++.h> // 头文件using namespace std;bool jo (int x) { // 判断是奇数还是偶数函数 if ( x % 2 == 0) return 1; // 是偶数返回真 return 0; // 不是就返回假}int main() { // 主函数 int n , j = 0 , k = 0; // j 为偶数的数量 k 为奇数的数量 cin >> n; // 输入 n int a[n]; for(int i = 0; ...