[NOIP2006] 普及组

明明的随机数

STL真是偷懒神器

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<vector>
 8 using namespace std;
 9 const int mxn=110;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 int a[mxn];
17 int n;
18 int main(){
19     n=read();
20     for(int i=1;i<=n;i++)a[i]=read();
21     sort(a+1,a+n+1);
22     n=unique(a+1,a+n+1)-a-1;
23     printf("%d\n",n);
24     for(int i=1;i<=n;i++)printf("%d ",a[i]);
25     return 0;
26 }

 

 

开心的金明

01背包问题

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 int w[50000]={0};
 6 int p[50000]={0};
 7 int f[50000]={0};
 8 int main(){
 9     int n,m;
10     int i,j;
11     cin>>n>>m;
12     for(i=1;i<=m;i++){
13         scanf("%d%d",&w[i],&p[i]);
14     }
15     for(i=1;i<=m;i++)
16       for(j=n;j>w[i];j--){
17           f[j]=max(f[j-w[i]]+p[i]*w[i],f[j]);
18       }
19     cout<<f[n];
20     return 0;
21 }

 

 

 

Jam的计数法

模拟进位即可。具体看代码

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<vector>
 8 using namespace std;
 9 const int mxn=100010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 int s,t,w;
17 char a[30];
18 int main(){
19     s=read();t=read();w=read();
20     int i,j,k;
21     scanf("%s",a+1);
22     for(i=1;i<=5;i++){
23         for(j=w;j;--j){
24             if(a[j]-'a'<t-(w-j+1)){
25                 a[j]++;
26                 for(k=j+1;k<=w;k++){
27                     a[k]=a[k-1]+1;
28                 }
29                 printf("%s\n",a+1);
30                 break;
31             }    
32         }
33     }
34     return 0;
35 }

 

 

数列

观察可以发现规律:需要乘的数和该位置的序号的二进制表示有关

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<vector>
 7 using namespace std;
 8 const int mxn=1200;
 9 int mi[mxn];
10 int tsu[mxn];
11 int k,n;
12 int main(){
13     cin>>k>>n;
14     int bas=n;
15     int ct=0;
16     while(n){ n>>=1; ct++; }n=bas;
17     mi[0]=1;
18     for(int i=1;i<=ct;i++)mi[i]=mi[i-1]*k;
19     tsu[0]=1;
20     for(int i=1;i<=ct;i++)tsu[i]=tsu[i-1]*2;
21     int ans=0;
22     for(int i=ct;i>=0;i--){
23         if(n>=tsu[i]){
24             n-=tsu[i];
25             ans+=mi[i];
26         }
27     }
28     cout<<ans<<endl;
29     return 0;
30 }

 

posted @ 2016-10-26 12:50  SilverNebula  阅读(194)  评论(0编辑  收藏  举报
AmazingCounters.com