noip2016 普及組
阿新 • • 發佈:2017-07-05
alt 比較 last b+ pre ref 狀態 %x ide
T1 買鉛筆 題目傳送門
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}View Codereturn ans*f; } int n,x,y,ans=inf; int main() { int now,nowf; n=read(); for(int i=1;i<=3;i++){ x=read(); y=read(); if(n%x) now=n/x+1; else now=n/x; nowf=now*y; ans=min(ans,nowf); } printf("%d\n",ans); return 0; }
T2 回文日期 題目傳送門
這道題其實枚舉一波年份再判就好了 當時傻逼了就直接枚舉了 mdzz
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=51848250; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10View Code+(c-‘0‘); c=getchar();} return ans*f; } int n; int f[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}}; int nx,ny,nz,tail=1,ans; struct node{int x,y,z;}q[M]; int pd(int x){ if(x%4) return 0; if(x%100==0){ if(x%400==0) return 1; return 0; } return 1; } int check(int x){ int sx=q[x].x,sy=q[x].y,sz=q[x].z; //printf("%04d%02d%02d\n",sx,sy,sz); return (sx!=nx||sy!=ny||sz!=nz); } void add(int k){ int x=q[k].x,y=q[k].y,z=q[k].z+1; int now=pd(x); if(f[now][y]<z) z=1,y++; if(y>12) y=1,x++; tail++; q[tail].x=x; q[tail].y=y; q[tail].z=z; } int okay(int x){ int ans=q[x].x*10000+q[x].y*100+q[x].z; //printf("%d\n",ans); int s[10]; for(int i=1;i<=8;i++) s[i]=ans%10,ans=ans/10; return s[1]==s[8]&&s[2]==s[7]&&s[3]==s[6]&&s[4]==s[5]; } int main() { n=read(); q[tail].x=n/10000; q[tail].y=n/100%100; q[tail].z=n%100; //printf("[%d %d %d]\n",q[1].x,q[1].y,q[1].z); n=read(); nx=n/10000; ny=n/100%100; nz=n%100; if(okay(tail)) ans++; while(check(tail)){ add(tail); if(okay(tail)) ans++; } printf("%d\n",ans); return 0; }
T3 海港 題目傳送門
這道題搞了個隊列記一波就okay了 代碼簡潔
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=100007,mx=86400; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int sum[M]; struct node{int t,w;}q[3*M]; int head,tail,n,last,k,x,tot; int main() { n=read(); for(int i=1;i<=n;i++){ last=read(); k=read(); for(int i=1;i<=k;i++){ x=read(); if(!sum[x]) tot++; sum[x]++; q[tail].t=last; q[tail++].w=x; } while(q[head].t+mx<=last&&head<tail){ int now=q[head++].w; sum[now]--; if(!sum[now]) tot--; } printf("%d\n",tot); } return 0; }View Code
T4 魔法正 題目傳送門
這道題 還是有點復雜了 自己沒寫出來 看了波題解開著
首先由題目可得 設c-d差距為i 則a-b距離是2i b-c距離要大於6i 這樣我們外層枚舉i內層枚舉d就可以解決問題了
當然由於a,b可以由c,d推過來但是滿足情況的c,d太多了所以要從邊界模擬過來使得所有被枚舉的c,d都合法 把這些合法的狀態都累加起來算就比較方便 降一波復雜度
同理c,d
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=45007,maxN=15007; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int sum,xa,xb,xc,xd; int n,m,id[M],w[maxN]; int a[maxN],b[maxN],c[maxN],d[maxN]; int main() { n=read(); m=read(); for(int i=1;i<=m;i++) id[i]=read(),w[id[i]]++; for(int i=1;i<=n/9;i++){ int now=i*9; sum=0; for(xa=n-now-1;xa;xa--){ xb=xa+2*i; xc=xb+6*i+1; xd=xc+i; sum+=w[xc]*w[xd]; a[xa]+=w[xb]*sum; b[xb]+=w[xa]*sum; } sum=0; for(xd=now+1;xd<=n;xd++){ xc=xd-i; xb=xc-6*i-1; xa=xb-2*i; sum+=w[xa]*w[xb]; c[xc]+=sum*w[xd]; d[xd]+=sum*w[xc]; } } for(int i=1;i<=m;i++) printf("%d %d %d %d\n",a[id[i]],b[id[i]],c[id[i]],d[id[i]]); return 0; }View Code
noip2016 普及組