本文主要是介绍Codeforces Round #238 (Div. 2) | 前4题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
A. Gravity Flip
直接sort一下就ok了。貌似div.2的第一题都习惯于sort...
B. Domino Effect
题意应该都能懂吧,求最后还竖立的个数。
因为题目说到两个L之间肯定有一个R,两个R直接就肯定会有个L,所以遍历一遍过去。找到L(非第一个),就找L后面的R,L和R之间肯定最后都是竖立。找到R,就往后面找L,判断两者之间的骨诺米牌个数的奇偶性,为奇数,则+1。
*注意,开头如果是R的话,要把R前面的个数加上去。结尾为L的话,要把L后面的个数加上去。如果整行都没LR,直接特判一下输入总数。
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;
const int SIZE = 3005;
char str[SIZE];
int main()
{int n;while(scanf("%d",&n)!=EOF){getchar();scanf("%s",str);int cot = 0,flag = 0;int ml = 0,j;for(int i = 0; i < n; i++){if(str[i] == 'L'){ml = 0;if(flag == 0){flag = 1;}for( j = i+1; j < n; j++){if(str[j] == 'R'){ml = 1;cot += (j - i - 1);i = j-1;break;}}if(ml == 0){cot += (n - (i+1));//cout<<n - (i+1)<<endl;i = n-1;}}else if(str[i] == 'R'){if(flag == 0){cot += i;flag = 1;}for(j = i+1; j < n; j++){if(str[j] == 'L'){cot += ((j-i-1)%2);i = j-1;break;}}}}if(flag == 0)printf("%d\n",n);elseprintf("%d\n",cot);}return 0;
}
C. Unusual Product
某进说他是看样例出来的= =。假设一开始输出是1,那么无论变row还是col,变奇数次的话,输出就变0,偶数次就不变。
下面就讲常规方法。
假设一个3*3的矩阵.
a b c
d e f
g h i
那么求解的过程就是(aa+bd+cg)+(bd+ee+fh)+(cg+fh+ii);结果对2求余。那么我们可以发现bd,cg,fh前面的系数都为2,那实际对2求余后都变为0,解就是aa+ee+ii的和对2求余。那实际上无论行列,只要改变一个数就够了。
D. Toy Sum
这题后来才补上的= =。研究了两个小时,最后还是失败了。求问涛神,立马搞定orz。
问题是要你找一些数满足题目给出的方程。
X数组:老师选;
Y数组:我们选;
我们知道,每个数都会有一个数和它想对应。例如1 和10^6就是相对应的。
那么很简单,假如有一个1,那么我就直接找对应的10^6。看它是否已经被选入X,如果没有,就入选Y,t++。否则,记录下来,cot++;
最终个数就是t+cot*2;
其实1和10^6跟2和10^6-1是完全可以对应的。只要X同时入选了1和10^6,那么Y入选2和10^6-1就好了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
const int P = 1000005;
using namespace std;
const int s = 1000000;
int a[P];
int main()
{int n;while(cin>>n){memset(a,0,sizeof(a));int tmp;for(int i = 0; i < n; i++){scanf("%d",&tmp);a[tmp] = 1;}int cot = 0;int t = 0;for(int i = 1;i <= s;i++){if(a[i] == 1&&a[s-i+1]==1){cot++;a[i] = a[s-i+1] = -1;continue;}if(a[i] == 1&&a[s-i+1] == 0){t++;a[i] = -1;a[s-i+1] = 2;}}printf("%d\n",t+cot*2);for(int i = 1;i <= s;i++){if(cot==0){break;}if(a[i] == 0&&a[s-i+1] == 0){a[i] = a[s-i+1] = 2;cot--;}}for(int i = 1;i <= s;i++){if(a[i] == 2){printf("%d ",i);}}puts("");
}
return 0;
}
这篇关于Codeforces Round #238 (Div. 2) | 前4题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!