首页 > 代码库 > [NOIP2005] 普及组

[NOIP2005] 普及组

明明的随机数

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 }

 

[NOIP2005] 普及组