NOIP2014 T1*2
D1T1 生活大爆炸版石头剪刀布
用时:10min 复杂度:n
简单模拟,照题意打表即可
#include<cstdio> using namespace std; int aka(int a,int b) { if(a==b) return 0; else { if(a==0&&b==1) return 0; if(a==0&&b==2) return 1; if(a==0&&b==3) return 1; if(a==0&&b==4) return 0; if(a==1&&b==0) return 1; if(a==1&&b==2) return 0; if(a==1&&b==3) return 1; if(a==1&&b==4) return 0; if(a==2&&b==0) return 0; f(a==2&&b==1) return 1; if(a==2&&b==3) return 0; if(a==2&&b==4) return 1; if(a==3&&b==0) return 0; if(a==3&&b==1) return 0; if(a==3&&b==2) return 1; if(a==3&&b==4) return 1; if(a==4&&b==0) return 1; if(a==4&&b==1) return 1; if(a==4&&b==2) return 0; if(a==4&&b==3) return 0; } } int akb(int a,int b) { if(a==b) return 0; else { if(a==0&&b==1) return 1; if(a==0&&b==2) return 0; if(a==0&&b==3) return 0; if(a==0&&b==4) return 1; if(a==1&&b==0) return 0; if(a==1&&b==2) return 1; if(a==1&&b==3) return 0; if(a==1&&b==4) return 1; if(a==2&&b==0) return 1; if(a==2&&b==1) return 0; if(a==2&&b==3) return 1; if(a==2&&b==4) return 0; if(a==3&&b==0) return 1; if(a==3&&b==1) return 1; if(a==3&&b==2) return 0; if(a==3&&b==4) return 0; if(a==4&&b==0) return 0; if(a==4&&b==1) return 0; if(a==4&&b==2) return 1; if(a==4&&b==3) return 1; } } int main() { int n,a,b; scanf("%d%d%d",&n,&a,&b); int akioi[a+5],aknoi[b+5]; for(int i=1;i<=a;i++) scanf("%d",&akioi[i]); for(int i=1;i<=b;i++) scanf("%d",&aknoi[i]); int sum[n+5],num[n+5]; for(int i=1;i<=n;i++) { if(i%a!=0) sum[i]=akioi[i%a]; else sum[i]=akioi[a]; } for(int i=1;i<=n;i++) { if(i%b!=0) num[i]=aknoi[i%b]; else num[i]=aknoi[b]; } int ans_a=0,ans_b=0; for(int i=1;i<=n;i++) { ans_a+=aka(sum[i],num[i]); ans_b+=akb(sum[i],num[i]); } printf("%d %d",ans_a,ans_b); return 0; }
D2T1 无线网络发射器选址
用时:10min 复杂度 :n^4
简单模拟,注意维护边界,比较方便的做法是把所有的坐标加上20
#include<cstdio> #include<algorithm> using namespace std; int mp[175][175],an[175][175]; int main() { int d,n,tot=0,ans=-432143; scanf("%d%d",&d,&n); for(int i=1,x,y,k;i<=n;i++) { scanf("%d%d%d",&x,&y,&k); mp[x+20][y+20]=k; } for(int i=20;i<=148;i++) for(int j=20;j<=148;j++) for(int a=i-d;a<=i+d;a++) for(int b=j-d;b<=j+d;b++) an[i][j]+=mp[a][b],ans=max(an[i][j],ans); for(int i=20;i<=148;i++) for(int j=20;j<=148;j++) if(an[i][j]==ans) tot++; printf("%d %d",tot,ans); return 0; }