codeforces #197(div2)

caoxiaoran1202發表於2013-08-28

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;
}


 

相關文章