Codeforces Round #410 (Div. 2)

来源:互联网 发布:笔记本清理垃圾软件 编辑:程序博客网 时间:2024/05/17 02:10

A.

题意:给你一个字符串,让你判断这个字符串能否修改一个字符后是回文串

思路:暴力枚举,(一定要与原来的字符串不同,开始忘了判了,queue那么长,好久才出结果,又用char型写了几次,最后才改了原来的做法过了)

#include<bits/stdc++.h>using namespace std;bool pa(string s){    string ss = s;    reverse(ss.begin(),ss.end());    return ss == s;}int main(){    string s,ss;    cin>>s;    for(int i = 0;i < s.size();i++)    {        ss = s;        for(char j = 'a';j <= 'z';j++)        {            if(ss[i] == j)                continue;            ss[i] = j;            if(pa(ss))                return 0 * printf("YES\n");            ss = s;        }    }    printf("NO\n");}

B.

题意:给你n个字符串,每个字符串可以把最前面的字符移到最后面,让你求最小的移动次数使得所有字符串相同。

思路:暴力枚举,另任意串为标准串,其他n-1个串,转到标准串的和取最小值。(自己的循环i、j竟然写错了,我擦,这是大一C语言也不会犯的错误啊,哎,码力下降太多了,又用char写了一遍,其实是循环写错了)

#include<bits/stdc++.h>using namespace std;const int N = 55;string s[N],ss[N];int Cal(string t,string tt){    int l = t.size(),ll = tt.size();    for(int i = 0,j;i+l < ll;i++)    {        for(j = 0;j < l;j++)        {            if(tt[i+j] != t[j])//¾¹È»ÍüÁËi+j£¬°¡°¡°¡°¡                break;        }        if(j == l)            return i;    }    return -1;}int main(){    int n;    cin>>n;    for(int i = 0;i < n;i++)    {        cin>>s[i];        ss[i] = s[i];    }    for(int i = 0;i < n;i++)        ss[i] = ss[i] + s[i];    int minn = 0x3f3f3f3f,cnt;    for(int i = 0;i < n;i++)    {        int sum = 0;        for(int j = 0;j < n;j++)        {            if(i == j)                continue;            cnt = Cal(s[i],ss[j]);            //cout<<cnt<<endl;            if(cnt == -1)                return 0 * printf("-1\n");            sum += cnt;        }        minn = min(minn,sum);    }    printf("%d\n",minn);    return 0;}

C.

题意:给你n个a[i],让你通过将ai , ai + 1修改成ai - ai + 1, ai + ai + 1的形式来使最后的gcd > 1,求最小修改次数。

思路:

我们如果对两个数操作两次,那么结果会变成- 2*ai + 1,2*ai,gcd>=2,所以结果一定是YES的。

然后我们只需要ai , ai + 1让变成偶数就行了,这样贪心“肯定”gcd最小为2的操作数是最少的


偶数和奇数,操作2次,都为偶数了


奇数和奇数,操作1次,都为偶数了

代码:

#include<bits/stdc++.h>using namespace std;const int N = 1e5+5;typedef long long ll;ll a[N],res = 0;/*void gao(ll p,ll q){}*/int main(){    int n;    cin>>n;    for(int i = 1;i <= n;i++)        scanf("%lld",&a[i]);    ll num = a[1];for(ll i = 2; i <= n ; i++)num = __gcd(num,a[i]);if(num != 1)return 0*printf("YES\n0\n");    for(int i = 1;i <= n;i++)        a[i] %= 2;    for(int i = 1 ; i <= n - 1 ; i++){if(a[i]){if(a[i+1]){    //a[i] = a[i+1] = 0;    a[i+1] = 0;    res++;}else            {                //a[i] = 0;                res += 2;            }}}    if(a[n])        res += 2;    printf("YES\n%lld\n",res);    return 0;}

D.

题意:

思路:

1 0
原创粉丝点击