【noip 2016】普及组
T1.买铅笔
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int n,p,w,ans=0x3f3f3f3f; 6 int read() 7 { 8 int x=0,f=1;char c=getchar(); 9 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 10 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 11 return x*f; 12 } 13 int main() 14 { 15 n=read(); 16 for(int i=1;i<=3;i++) 17 { 18 w=read(),p=read(); 19 if(n%w)w=n/w+1; 20 else w=n/w; 21 ans=min(ans,w*p); 22 } 23 printf("%d",ans); 24 return 0; 25 }
T2.回文日期
直接枚举年份,再判断日期是否合法就好了……然而我居然还WA了一发(好菜啊
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int d1,d2,ans; 6 int read() 7 { 8 int x=0,f=1;char c=getchar(); 9 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 10 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 11 return x*f; 12 } 13 int rev(int x) 14 { 15 int s[5],ans=0; 16 for(int i=1;i<=4;i++)s[i]=x%10,x/=10; 17 for(int i=1;i<=4;i++)ans=ans*10+s[i]; 18 return ans; 19 } 20 bool pan(int y,int m,int d) 21 { 22 int day=31; 23 if(m==4||m==6||m==9||m==11)day=30; 24 if(m==2) 25 { 26 if((y%4==0&&y%100!=0)||y%400==0)day=29; 27 else day=28; 28 } 29 if(m<1||m>12||d<1||d>day)return false; 30 return true; 31 } 32 int main() 33 { 34 d1=read();d2=read(); 35 for(int i=d1/10000;i<=d2/10000;i++) 36 { 37 int t=i*10000+rev(i); 38 if(pan(i,(t/100)%100,t%100)&&t>=d1&&t<=d2)ans++; 39 } 40 printf("%d",ans); 41 return 0; 42 }
T3.海港
因为保证输入的ti是递增的,所以开一个队列瞎搞就好了✔
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int n,k,t,ans,nat[100050]; 6 struct node{int t,nat;}q[300050]; 7 int read() 8 { 9 int x=0,f=1;char c=getchar(); 10 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 11 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 12 return x*f; 13 } 14 int main() 15 { 16 n=read(); 17 int head=0,tail=0; 18 while(n--) 19 { 20 t=read();k=read(); 21 while(k--) 22 { 23 q[++tail].nat=read(); 24 if(!nat[q[tail].nat])ans++; 25 nat[q[tail].nat]++; 26 q[tail].t=t; 27 } 28 while(q[head].t<=t-86400) 29 { 30 nat[q[head].nat]--; 31 if(!nat[q[head].nat])ans--; 32 head++; 33 } 34 printf("%d\n",ans); 35 } 36 return 0; 37 }
T4.魔法阵
据题意得,xb−xa=2(xd−xc),xc−xb>6(xd−xc),即总距离s>9(xd−xc);
另,魔法值相同的物品所需要输出的答案是一样的;
所以可以先枚举(xd−xc),再倒序枚举a的位置并推算出b及最小的合法c、d的位置并进行计算(倒序是为了使前面枚举过的c、d位置合法,方便累加);同理,正序枚举d的位置并推算出c及最大的合法a、b的位置并进行计算。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=15050; 6 int n,m,num,xa,xb,xc,xd; 7 int w[N],a[N],b[N],c[N],d[N],id[40050]; 8 int read() 9 { 10 int x=0,f=1;char c=getchar(); 11 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 12 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 13 return x*f; 14 } 15 int main() 16 { 17 n=read();m=read(); 18 for(int i=1;i<=m;i++) 19 { 20 id[i]=read(); 21 w[id[i]]++; 22 } 23 for(int i=1;i<=n/9;i++) 24 { 25 num=0; 26 for(xa=n-9*i-1;xa>=1;xa--) 27 { 28 xb=xa+2*i;xc=xb+6*i+1;xd=xc+i; 29 num+=w[xc]*w[xd]; 30 a[xa]+=w[xb]*num; 31 b[xb]+=w[xa]*num; 32 } 33 num=0; 34 for(xd=9*i+1;xd<=n;xd++) 35 { 36 xc=xd-i;xb=xc-6*i-1;xa=xb-2*i; 37 num+=w[xa]*w[xb]; 38 c[xc]+=w[xd]*num; 39 d[xd]+=w[xc]*num; 40 } 41 } 42 for(int i=1;i<=m;i++) 43 printf("%d %d %d %d\n",a[id[i]],b[id[i]],c[id[i]],d[id[i]]); 44 return 0; 45 }