洛谷 通天系列 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 }

 

posted @ 2016-10-31 16:38  SilverNebula  阅读(239)  评论(0编辑  收藏  举报
AmazingCounters.com