1. 程式人生 > >Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)ABCD總結

Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)ABCD總結

這場比賽發揮比較穩,在比賽開始45分鐘後 ABCD全是1A,並且最終過了終測。rating還沒出來,終測完rank146,希望能多上一點分吧。(這次程式碼放後面)E題互動題,依然不會做,待補。

A:給你三根木棒的長度,問你至少增加(任意一根木棒)多長長度才能使這三根木棒能夠成三角形。簽到題,排序後答案就是

max(0,c-b-a+1)。

B:給你a(0<=a<2e30) 求滿足a−(a⊕x)−x=0的x有多少個。打表很容易發現答案就是2的(a的二進位制中1的數量)次方。

C:給一個長度為n的字串,你把這些字串中的字元重新排序,使得排序後串的本質不同迴文串數量最多。之前做過一道構造題,自己在紙上畫畫也不難發現,只需要對每一個字元相同的連起來就可以了。

(補:長度為n的字串的本質不同迴文串數量最多為n。最少要看串中有幾個字母。)

D:這題可謂終測掛了一大片,就是給你一個n*m的地圖,'*'表示牆,不能走,'.'表示空地,可以走。給你你的起點座標(nn,mm),你可以上下左右移動,每次移動一個單位,但是你左往左移動的次數不超過x,往右移動的次數不超過y。問你有多少格子是你能到達的。

其實不難發現到達一個格子所消耗的往左、往右步數的最小值是唯一的。所以只需要記錄到達這個點往左往右的最小步數即可。如果有更小的方案才加入佇列。我的程式碼跑了186ms,還是比較快的。

放上一張D題終測的截圖:(侵刪)

真是壯觀!

程式碼:

A:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
    int T,cas=1;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        if(n+m>k&&n+k>m&&m+k>n) ans=0;
        else
        {
            ans=min(abs(k-(n+m)+1),abs(n-(k+m)+1));
            ans=min(ans,abs(m-(n+k)+1));
        }
        printf("%d\n",ans);
      //  if(flag) puts("Yes"); else puts("No");
    }
    return 0;
}

B:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int fcount(int x)  //求數x二進位制下所含1的個數
{
 int s=0;
 while(x){
  s++;
  x&=(x-1);
 }
    return s;
}
int main()
{
    int T,cas=1;
    n=20;
    scanf("%d",&T);
    
    while(T--)
    {
        scanf("%d",&n);
        ll ii=pow(2,fcount(n));
        cout<<ii<<endl;
        //printf("%d\n",ans);
      //  if(flag) puts("Yes"); else puts("No");
    }
    return 0;
}

C:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
    int T,cas=1;
    scanf("%d",&n);
    scanf("%s",s);
    memset(c,0,sizeof(c));
    for(int i=0;i<n;i++)
    {
        c[s[i]-'a']++;
    }
    for(int i=0;i<26;i++)
    {
        while(c[i]--)
        {
            char ch=i+'a';
            cout<<ch;
        }
    }
    cout<<endl;
        //printf("%d\n",ans);
      //  if(flag) puts("Yes"); else puts("No");
    return 0;
}

D:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2010;
int n,m,k,nn,mm;
int a[maxn],sum[maxn];
int c[maxn][maxn],cc[maxn][maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn][maxn];
int X,Y;
struct node
{
    int x,y;
    int zuo,you;
    node(){zuo=0;you=0;}
    node(int a,int b){x=a;y=b;zuo=0;you=0;}
};
int dxy[]={1,0,-1,0,0,1,0,-1};
bool jud(int x,int y)
{
    if(x<0||x>=n||y<0||y>=m) return 0;
    return 1;
}
void bfs(int ii,int jj)
{
    ans=0;
    memset(c,-1,sizeof(c));
    memset(cc,-1,sizeof(cc));
    queue<node>q;
    q.push(node(ii,jj));
    c[ii][jj]=cc[ii][jj]=0;ans++;
    while(!q.empty())
    {
        node kk,k=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            kk=k;
            int x=k.x+dxy[i],y=k.y+dxy[i+4];
            if(!jud(x,y)) continue;
            if(s[x][y]=='*') continue;
            if(i==1) kk.you=k.you+1;
            if(kk.you>Y) continue;
            if(i==3) kk.zuo=k.zuo+1;
            if(kk.zuo>X) continue;
            if(c[x][y]!=-1&&cc[x][y]!=-1&&c[x][y]<=kk.zuo&&cc[x][y]<=kk.you)
            continue;
            if(c[x][y]==-1||cc[x][y]==-1) ans++;
            //cout<<x<<" "<<y<<endl;
            if(c[x][y]==-1||c[x][y]>kk.zuo)
            c[x][y]=kk.zuo;
            if(cc[x][y]==-1||cc[x][y]>kk.you)
            cc[x][y]=kk.you;
            kk.x=x;kk.y=y;
            q.push(kk);
        }
    }
    printf("%d\n",ans);
}
int main()
{
    int T,cas=1;
    scanf("%d%d",&n,&m);
    scanf("%d%d",&nn,&mm);
    scanf("%d%d",&X,&Y);
    for(int i=0;i<n;i++)scanf("%s",s[i]);
    bfs(nn-1,mm-1);
    //printf("%d\n",ans);
    //  if(flag) puts("Yes"); else puts("No");
    return 0;
}