洛谷 通天系列 P1760 P1757 P1759
P1760 通天之汉诺塔
汉诺塔问题。一个高精乘单精解决
ans=2^n-1
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=10001; 10 int len=1; 11 int a[mxn]; 12 int main(){ 13 int i,j,n; 14 scanf("%d",&n); 15 a[1]=1; 16 for(i=1;i<=n;i++){ 17 for(j=len;j;j--){ 18 a[j]*=2; 19 a[j+1]+=a[j]/10; 20 a[j]%=10; 21 } 22 if(a[len+1]) ++len; 23 } 24 a[1]-=1; 25 for(i=len;i;i--)printf("%d",a[i]); 26 printf("\n"); 27 return 0; 28 }
P1757 通天之分组背包
普通的分组背包。
写二维分组背包会挂一个点,原因不明,看评测记录,好像所有的二维分组背包都挂掉了
换成一维以后ac
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=1010; 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 vector<int>mp[mxn]; 17 int n,m; 18 int a[mxn],b[mxn],c; 19 int f[mxn]; 20 int main(){ 21 int i,j; 22 m=read();n=read(); 23 for(i=1;i<=n;++i){ 24 a[i]=read();b[i]=read();c=read();mp[c].push_back(i); 25 } 26 for(i=1;i<=100;i++){ 27 if(mp[i].empty())continue; 28 for(int k=m;k>=0;--k){ 29 for(j=0;j<mp[i].size();++j){ 30 int *t=&mp[i][j]; 31 if(k<a[*t])continue; 32 f[k]=max(f[k],f[k-a[*t]]+b[*t]); 33 } 34 } 35 } 36 printf("%d\n",f[m]); 37 return 0; 38 }
P1759 通天之潜水
双限制01背包,需要记录方案。
背包本身很简单,怎么记录方案呢?
数据范围不大,干脆开个数组暴力记录当前状态所选的所有工具。
更新状态的时候,把上个状态的记录memcpy过来就可以
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=202; 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 f[mxn][mxn]; 17 int w[mxn][mxn][mxn]; 18 int len[mxn][mxn]; 19 int a[mxn],b[mxn],c[mxn]; 20 int m,v,n; 21 int main(){ 22 m=read();v=read();n=read(); 23 int i,j,k; 24 for(i=1;i<=n;i++){ 25 a[i]=read();b[i]=read();c[i]=read(); 26 } 27 for(i=1;i<=n;i++){ 28 for(j=m;j;j--){ 29 for(k=v;k;k--){ 30 if(j>=a[i] && k>=b[i]){ 31 if(f[j-a[i]][k-b[i]]+c[i]>f[j][k]){ 32 f[j][k]=f[j-a[i]][k-b[i]]+c[i]; 33 memcpy(w[j][k],w[j-a[i]][k-b[i]],sizeof w[j][k]); 34 len[j][k]=len[j-a[i]][k-b[i]]+1; 35 w[j][k][len[j][k]]=i; 36 } 37 } 38 } 39 } 40 } 41 printf("%d\n",f[m][v]); 42 for(i=1;i<=len[m][v];i++)printf("%d ",w[m][v][i]); 43 printf("\n"); 44 return 0; 45 }
本文为博主原创文章,转载请注明出处。