[NOIP2005] 普及组
Posted SilverNebula
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 }
模拟进位即可。具体看代码
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] 普及组的主要内容,如果未能解决你的问题,请参考以下文章
P1048 [NOIP2005 普及组] 采药(01背包 dp)
求(NOIP2005、2006)第十一届、十二届全国青少年信息学奥林匹克联赛初赛普及组答案.