codeforces #197(div2)

来源:互联网 发布:文明5美丽新世界mac版 编辑:程序博客网 时间:2024/05/16 10:20

A:就是将1、2、3、排序后后,中间依次加上'+'

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;char s[110];char ss[110];int main(){    cin>>s;    int len=strlen(s);    int c1=0,c2=0,c3=0;    for(int i=0;i<len;i++)    {        if(s[i]=='1')            c1++;        if(s[i]=='2')            c2++;        if(s[i]=='3')            c3++;    }    for(int i=0;i<c1;i++)        s[i]='1';    for(int i=c1;i<c1+c2;i++)        s[i]='2';    for(int i=c1+c2;i<c1+c2+c3;i++)        s[i]='3';    int ret=0;    for(int i=0;i<len;i++)    {        if(i%2==0)        {            ss[i]=s[ret];            ret++;        }        else            ss[i]='+';    }    puts(ss);    return 0;}


 

B:一步一步算,注意结果变量定义为__int64

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int a,now;int main(){    int n,m;    scanf("%d%d",&n,&m);    now=1;    __int64 ans=0;    for(int i=0;i<m;i++)    {        scanf("%d",&a);        if(a>=now)            ans+=(a-now);        else if(a<now)            ans+=(n+a-now);        now=a;        //cout<<ans<<endl;    }    cout<<ans<<endl;    return 0;}


 

C:dfs 因为少加了一个条件,一直T,中间有一个细节处理参考其他人的

#include<iostream>#include<cstdio>#include<cstring>#include<string>bool h[12],flag=false;int a[1100];int m;void dfs(int n,int ch,int prev){    if(n>m)    {        flag=true;        printf("YES\n%d",a[0]);        for(int i=1; i<n; ++i)            printf(" %d",a[i]);        printf("\n");        return;    }    for(int i=ch+1; !flag&&i<=10; ++i) //flag没做判断,一直T    if(h[i]&&i!=prev)    {        a[n]=i;        dfs(n+1,i-ch,i); //**很神奇的安排 i-ch加入后使之相等的值,i前一个值作比较    }}int main(){    char c;    for(int i=1;i<=10;i++)    {        scanf("%c",&c);        if(c=='1')            h[i]=true;    }    scanf("%d",&m);    m--;    dfs(0,0,0);    if(flag==false )        printf("NO\n");    return 0;}


 

D:处理太巧妙了,如果会做很简洁、优美的代码就过了。

它是这样处理的,加入n=3,数组标号:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  17将初始的8个数处在8-17中,输入一个处理一个,

第一轮或运算结果放在4-7中,第二轮异或运算放在2-3中,。。。。最后一个数放1中。

在询问时加入改变第n个数,则改变需要改变的数组中存放的值。加入8个数改变第五个,那么首先要改变6,3,1;需要处理的数只有几个而已。

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>using namespace std;int l[400000];int n,m;void solve(int p,int a){    int t=1;    l[p]=a;    while(p>1)    {        p/=2;        if(t==1)            l[p]=l[p*2]|l[p*2+1];        else            l[p]=l[p*2]^l[p*2+1];        t=t^1;    }}int main(){    //cout<<pow(2,18)<<endl;    scanf("%d%d",&n,&m);    int a,b;    n=1<<n;    for(int i=1;i<=n;i++)    {        scanf("%d",&a);        solve(i+n-1,a);    }    while(m--)    {        scanf("%d%d",&b,&a);        solve(b+n-1,a);        printf("%d\n",l[1]);    }    return 0;}