Codeforces Round #770 (Div. 2) A~C

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题过的人都多,奇偶性属实不太好想~

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UmVfX1BvaW50

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值