A. https://codeforces.com/contest/1634/problem/A
题意:
给定字符串s,你可以进行k次操作,每次操作先将s反转为s`,然后用s`+s 或者s+s`替代s,求进行k次这样的操作最后能得到几种不同的字符串。
分析:
首先,如果操作数k为0,那么能得到的字符串就只有最初的s一种。
其次,k > 0时
如果s是一个回文串,那么s`还是它本身,所以不管怎么操作都只能得到一种结果,只是s的k次叠加而已,输出1;
如果s一开始不是一个回文串,那么经过一次操作后,会得到两个不同的回文串,之后不管几次操作也就是这两个回文串自身的叠加,所以输出2。
AC Code:
#include<bits/stdc++.h>
using namespace std;
string s;
int t,n,k;
//判断是否回文
bool judge()
{
int l = 0, r = s.length() - 1;
while(l < r){
if(s[l] != s[r]) return false;
l++,r--;
}
return true;
}
int main(void)
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &k);
cin >>s;
if(k == 0) { cout <<1 <<endl; continue; }
if(judge()) cout <<1 <<endl;
else cout <<2 <<endl;
}
return 0;
}
B. https://codeforces.com/contest/1634/problem/B
题意:
给定一个长度为n的数组a,两个数字状态x和y,两个人Alice和Bob。
现在Alice的初始状态为x,Bob的初始状态为x+3,求二人利用数组里的所有数进行操作(将现有的结果res与ai相加,或者将res与ai异或)以后,谁可以到达状态y。
分析:
这是一个奇偶性的题,首先要明确,不管时加法还是异或操作,如果进行操作的两个数奇偶性相同,结果为偶数,不同则为奇数。
题的结果只有两种,要么Alice,要么Bob,同时注意到起始状态x和x+3的奇偶性一定不同,那么通过这两个状态进行操作后得到的结果的奇偶性也一定不同。
所以可以以x为起始状态,根据性质去判断进行操作后能得到什么样的奇偶性,与y奇偶性相同,说明时Alice,不同,说明是Bob。
Notice:
这个题数据有一个超int的,所以可以考虑全开long long。
判断能得到的奇偶性,你可以选择用一个标记来表示当前得到的奇偶性状态,然后在数组输入时候不断更新,也可以直接将变量开到long long,直接进行加和操作,亦或者去半计数的判断,道理是一样的。
还有就是队友用快读TLE了,估计是评测机不接受,可以直接scanf,或者std::ios::sync_with_stdio(false); cin.tie(NULL); + cin读入
当然今天我尝试的话直接cin也没问题,反正读入需要多注意。
AC Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n,x,ai,y;
int main(void)
{
cin >>t;
while(t--)
{
cin >>n >>x >>y;
for(int i = 1; i <= n; i++){
cin >>ai;
x += ai;
}
if((x&1) == (y&1)) cout <<"Alice" <<endl;
else cout <<"Bob" <<endl;
}
return 0;
}
C. https://codeforces.com/contest/1634/problem/C
题意:
给定n和k,将1到n*k放进n行k列的矩阵里,条件是每一行里随便揪出一串位置连续的数字,他们的平均数是一个整数。
分析:
有样例完全是一件幸福的事,虽然我WA了两发。
一看到1 3 2 4就来了灵感。简单论证一下:假定一个等差数列,公差为d,现在取出它的第n项到第m项(m >= n),共m-n+1项,那么:
所以间隔为2输出数字不是巧合,现在说明一个问题,只要是将矩阵变为一系列公差为2的等差数列,就满足题意,大部分情况就可以直接按这个思路输出了,比如4行4列可以是1357,2468,9 11 13 15,10 12 14 16。
然后特殊情况k == 1,就直接1到n换行输出就可以。
最后,将矩阵变为一系列公差为2的等差数列,是只有n为偶数才可以,n为奇数没办法构造,因为那样必定会造成某一行又有奇数又有偶数,当选择的数都涵盖的时候,平均数一定是小数,所以只能输出No了。
AC Code:
#include<bits/stdc++.h>
using namespace std;
int t,n,k;
int main(void)
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
cin >>t;
while(t--)
{
cin >>n >>k;
if(k == 1){
cout <<"YES" <<endl;
for(int i = 1; i <= n; i++) cout <<i <<endl;
continue;
}
//如果是奇数行,输出NO
if(n&1) cout <<"NO" <<endl;
else{
cout <<"YES" <<endl;
int ans = 1;
for(int i = 1; i <= n/2; i++)
{
for(int j = 1; j <= k; j++){
cout <<ans; if(j != k) cout <<' ';
ans += 2;
}
cout <<endl;
}
ans = 2;
for(int i = 1; i <= n/2; i++)
{
for(int j = 1; j <= k; j++){
cout <<ans; if(j != k) cout <<' ';
ans += 2;
}
cout <<endl;
}
}
}
return 0;
}
这次C题比B题过的人都多,奇偶性属实不太好想~