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\n",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; }