1. 程式人生 > >【noip 2016】普及組

【noip 2016】普及組

scrip one clu sel b+ -s 位置 ref print

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】普及組