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

猜你喜欢

转载自blog.csdn.net/LSD20164388/article/details/83051147