首页 > 代码库 > 【noip 2016】普及组

【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 }
View Code

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 }
View Code

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 }
View Code

T4.魔法阵

题目链接

据题意得,x?b???x?a??=2(x?d???x?c??),x?c???x?b??>6(x?d???x?c??),即总距离s>9(x?d???x?c??);

另,魔法值相同的物品所需要输出的答案是一样的;

所以可以先枚举(x?d???x?c??),再倒序枚举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 }
View Code

 

【noip 2016】普及组