codeforces 798

A 改变一个字符变成回文 统计要改变的数目  如果1个不一样是可以的  坑点是奇数的时候   可以改变中间那个 

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll   __int64
#define MAXN  100
#define inf  2000000007
char z[MAXN];

int main()
{
    scanf("%s",z);
    int len=strlen(z);
    int ok=0;

    int cnt=0;
    for(int i=0,j=len-1;i<len/2;i++,j--)
        if(z[i]!=z[j])
            cnt++;
    if(cnt==1)
        ok=0;
    else
        ok=1;
    if(len==1||cnt==0&&len%2==1)
        printf("YES\n");
    else
    {
        if(ok==0)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
View Code

B 操作是移动第一个字母到最后  使得所有的字符串相同  问最少步数暴力每个能到达的串  更新步数

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll   __int64
#define MAXN  110
#define inf  2000000007
char z[MAXN][MAXN],n1[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%s",z[i]);
        strcpy(n1,z[1]);
        int len=strlen(n1);
        int mx=inf;
        int ok=0;
        for(int ind=0;ind<len;ind++)
        {
            int sum=0;
            for(int i=1;i<=n;i++)
            {
                int o1=0;

                for(int j=0;j<len;j++)
                {
                    int k,c1,kk;
                    for(k=j,c1=0,kk=ind;c1<len;k=(k+1)%len,c1++,kk=(kk+1)%len)
                        if(z[i][k]!=n1[kk])
                            break;
                    if(c1==len)
                    {
                        sum=sum+j;
                        o1=1;
                        break;
                    }
                }
                if(o1==0)
                    ok=1;
            }
            mx=min(mx,sum);
        }

        if(ok==1)
            printf("-1\n");
        else
            printf("%d\n",mx);
    }
    return 0;
}
View Code

C操作是改变相邻2个 变成a-b  a+b  最后答案是肯定有解的    因为变2步就是 -2a 2a 至少是2一开始要求一下gcd  可能都是奇数 然后不用变就>2

然后判断     i       i+1               

               奇数     奇数   1   1   0   2                             1步

               奇数     偶数   1   2   -1  3  -4  2                   2步  

 以此类推  最后一个数有点问题

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll   __int64
#define MAXN  110000
#define inf  2000000007

int z[MAXN];
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int d=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&z[i]);
            d=gcd(d,z[i]);
        }
        if(d>1)
        {
            printf("YES\n0\n");
            continue;
        }
        int ans=0;
        for(int i=1;i<n;i++)
        {
            int c1=0;
            if(z[i]%2==1)
            {
                c1++;
                if(z[i+1]%2==1)
                    c1++;
                if(c1==1)
                {
                    ans=ans+2;
                    z[i]=z[i+1]=2;
                }
                else if(c1==2)
                {
                    ans=ans+1;
                    z[i]=z[i+1]=2;
                }
            }
        }
        if(z[n]%2==1)
            ans=ans+2;
        printf("YES\n%d\n",ans);
    }
    return 0;
}
View Code

D 要求取出的下标  的对应的值的和 *2>原来的 

就是 取出来下标对应值  >剩下的

先按 a排序   那么取出肯定满足a  相邻2个取大的b  那么满足b   然后最后一个讨论下  

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll   __int64
#define MAXN  110000
#define inf  2000000007

struct node
{
    int a,b,i;
}c[MAXN];
bool cmp(node a,node b)
{
    return a.a>b.a;
}
int ans[MAXN];
bool vis[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&c[i].a);
            c[i].i=i;
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&c[i].b);
        }
        sort(c+1,c+n+1,cmp);
        int cnt=1;
        ans[cnt++]=c[1].i;
        for(int i=2;i<=n;i=i+2)
        {
            if(i==n)
            {
                ans[cnt++]=c[i].i;
            }
            else
            {
                if(c[i].b>c[i+1].b)
                    ans[cnt++]=c[i].i;
                else
                    ans[cnt++]=c[i+1].i;
            }
        }

        printf("%d\n",cnt-1);
        for(int i=1;i<cnt-1;i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[cnt-1]);
    }
    return 0;
}
View Code

 

 

 

               

 

posted on 2017-05-02 14:44  HelloWorld!--By-MJY  阅读(180)  评论(0编辑  收藏  举报

导航