CodeForces754A
题意:
给一个数组,让你变成1-n,输出变换区间,要求原区间和不为0.
思路:
如果原数组不为0,那就是YES;
如果为0,则从1开始扫过去,碰到不为0时,分两个区间[1,k],[k+1,n]
#include<bits/stdc++.h> using namespace std; int a[110]; int main() { int n,i,sum; while(~scanf("%d",&n)) { sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } if(sum==0) { sum=0; for(int s=1;s<=n;s++) { sum+=a[s]; if(sum) { if(s!=n) { puts("YES"); puts("2"); printf("%d %d ",1,s); printf("%d %d ",s+1,n); } else { puts("YES"); printf("%d %d ",1,n); } return 0; } } puts("NO"); } else { puts("YES"); puts("1"); printf("%d %d ",1,n); } } return 0; }
CodeForces754B
题意:
'.' (empty cell),'x' (lowercase English letter x),
'o' (lowercase English letter o).
horizontal, vertical or diagonal有3个获胜,问能否在一部内使得有x在horizontal, vertical or diagonal连成3个。
思路:
暴力枚举horizontal, vertical or diagonal?
#include<bits/stdc++.h> using namespace std; char ma[5][5]; bool manzu(int x) { if(x>=0&&x<4) return true; return false; } bool judge_three(int sx,int sy,int ex,int ey) { int num1,num2; int i,j; num1=num2=0; for(i=sx,j=sy;;) { if(ma[i][j]=='x') num1++; if(ma[i][j]=='.') num2++; if(i==ex&&j==ey) break; if(i<ex) i++; if(j<ey) j++; } if(num1==2&&num2==1) return true; return false; } bool Judge(int x,int y) { if(manzu(x+2)) if(judge_three(x,y,x+2,y)) return true; if(manzu(x-2)) if(judge_three(x-2,y,x,y)) return true; if(manzu(y+2)) if(judge_three(x,y,x,y+2)) return true; if(manzu(y-2)) if(judge_three(x,y-2,x,y)) return true; if(manzu(x+2)&&manzu(y+2)) if(judge_three(x,y,x+2,y+2)) return true; if(manzu(x-2)&&manzu(y-2)) if(judge_three(x-2,y-2,x,y)) return true; if(manzu(x+2)&&manzu(y-2)) { int num1=0,num2=0; if(ma[x][y]=='x') num1++; if(ma[x][y]=='.') num2++; if(ma[x+1][y-1]=='x') num1++; if(ma[x+1][y-1]=='.') num2++; if(ma[x+2][y-2]=='x') num1++; if(ma[x+2][y-2]=='.') num2++; if(num1==2&&num2==1) return true; } if(manzu(x-2)&&manzu(y+2)) { int num1=0,num2=0; if(ma[x][y]=='x') num1++; if(ma[x][y]=='.') num2++; if(ma[x-1][y+1]=='x') num1++; if(ma[x-1][y+1]=='.') num2++; if(ma[x-2][y+2]=='x') num1++; if(ma[x-2][y+2]=='.') num2++; if(num1==2&&num2==1) return true; } return false; } int main() { for(int i=0; i<4; i++) scanf("%s",ma[i]); for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(Judge(i,j)) { puts("YES"); return 0; } puts("NO"); return 0; } /* o.x. o... .x.. ooxx */CodeForces599A
题意:
d1 is the length of the path house and first shop;
d2 is the length of the path house and second shop;
d3 is the length of the path both shops.
思路:
显然水题
#include<bits/stdc++.h> using namespace std; int a[110]; int main() { int num=0; int d1,d2,d3; scanf("%d%d%d",&d1,&d2,&d3); a[num++]=d1+d2+d3; a[num++]=2*(d1+d2); a[num++]=2*(d1+d3); a[num++]=2*(d2+d3); sort(a,a+num); printf("%d ",a[0]); return 0; }
CodeForces599B
题意:
给出f[],b[];
构造ai, 使得 b[i]=f[ai]
只有一组则直接输出
有多种情况输出"Ambiguity"
如果不可能就是不可能
思路:
直接模拟。
先搞出impossible的情况,也就是没有匹配的,其次看是不是存在多个的。
然后就是输出坐标就好了。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int index[N]; int f[N],a[N],n,m; int num[N]; bool flag,flat; int main() { scanf("%d%d",&n,&m); memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) { scanf("%d",&f[i]); index[f[i]]=i; num[f[i]]++; } flag=false; flat=false; for(int i=1;i<=m;i++) { scanf("%d",&a[i]); if(!num[a[i]]) flag=true; if(num[a[i]]>1) flat=true; } if(flag) puts("Impossible"); else if(flat) puts("Ambiguity"); else { puts("Possible"); for(int i=1;i<=m;i++) printf("%d ",index[a[i]]); } return 0; }