• 洛谷 通天系列 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("
    ");
    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
    ",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
    ",f[m][v]);
    42     for(i=1;i<=len[m][v];i++)printf("%d ",w[m][v][i]);
    43     printf("
    ");
    44     return 0;
    45 }
  • 相关阅读:
    MySQL之LEFT JOIN中使用ON和WHRERE对表数据
    Mysql索引分类
    个人发展战略(二)
    个人发展战略(一)
    List的add方法与addAll方法的区别、StringBuffer的delete方法与deleteCharAt的区别
    职业理财规划
    Servlet简介与Servlet和HttpServlet运行的流程
    Ajax的get、post和ajax提交
    Ajax方法
    监听器随笔
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6016366.html
Copyright © 2020-2023  润新知