Codeforces Round #516 (by Moscow Team Olympiad)

1064A - Make a triangle!

#include<cstdio>
#include<algorithm>
using namespace std;
int a[3];
int main(){
    for(int i=0;i<3;++i)scanf("%d",&a[i]);
    sort(a,a+3);
    printf("%d",max(0,a[2]+1-a[1]-a[0]));
    return 0;
}

1064B - Уравнения математической магии

#include<cstdio>
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int a,ans=1;
        scanf("%d",&a);
        for(;a;a>>=1)
            if(a&1) ans<<=1;
        printf("%d
",ans); 
    }
    return 0;
}

1063A - Ох уж эти палиндромы

这个题真的是绝了

 仔细思考一下,我们把一个字符串,无论怎样放置都不会比把所有相同的放在一起得到的回文串更多,为什么呢?因为我思考把aa 这两个字符如果放在一起,贡献为2+1;如果把它插入其他的回文串的对称位置,那么增加的贡献出了单个字符a外,也只是增加了一个。当我们有k个字符a时无论怎样放到其他字符串里也只是附带着别的字符串形成回文串。

#include<cstdio>
#include<algorithm>
using namespace std; 
char s[100005];
int main(){
    int n;
    scanf("%d%s",&n,&s);
    sort(s,s+n);
    printf("%s",s); 
    return 0;
}

1063B - Лабиринт

我们设起点为a,b

终点为c,d

设起点到终点向左走的步数和向右的步数为l,r

b+r-l=d

所以也就是说只要l确定,r也就确定

并且l越小,r也越小

所以我们在bfs只要标记出每个点l的最小值,同时也就能算出r的最小值了

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; 
const int N=2005;
struct A{
    int x,y;
};
queue<A>q;
char s[N][N];
int ls[N][N],bx[4]={1,-1},by[4]={0,0,1,-1};
int rd(){
    char c;
    while((c=getchar())<'0'||c>'9');
    int re=c-'0';
    while((c=getchar())>='0'&&c<='9') re=(re<<1)+(re<<3)+c-'0';
    return re; 
}
int main(){
    int n=rd(),m=rd(),r=rd(),c=rd(),zb=rd(),yb=rd(),ans=0;
    for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
    memset(ls,0x3f,sizeof(ls));
    q.push((A){r,c});ls[r][c]=0;
    for(;q.size();q.pop()){
        A t=q.front();
        for(int i=0;i<4;++i){
            int x=t.x+bx[i],y=t.y+by[i],tt=ls[t.x][t.y];
            if(i==3) ++tt;
            if(s[x][y]=='.'&&ls[x][y]>tt) ls[x][y]=tt,q.push((A){x,y});
        }
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(ls[i][j]<=zb&&j-c+ls[i][j]<=yb) ++ans;
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/bzmd/p/9946088.html