首页 > 代码库 > [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] 普及组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。