7.2集训模拟赛(莫名其妙的比赛......)

A.小猫爬山:(状压★★★)

题目描述:

输入格式:

 输出格式:

 样例:

样例输入:

 样例输出:

 数据范围与提示:

 分析:

这道题我神之迷惑~~~~链接教练博客(神之迷惑)

呃......不迷惑了,贴上新代码

Code新:

f数组记录状态为s时最少的花费,leave记录状态为s是最后一个缆车的剩余空间。

#include<bits/stdc++.h>
using namespace std;
int n,w;
int a[20];
int f[1<<19],leave[1<<19];

int main(){
    scanf("%d%d",&n,&w);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    memset(f,0x3f,sizeof(f));
    f[0]=1;
    leave[0]=w;
    int maxn = 1<<n;
    for(int s = 0;s < maxn; s++){
        for(int i = 1 ; i <= n;i++){
            if(leave[s]>=a[i] && f[s|(1<<(i-1))]>=f[s]){//如果最后一个缆车能装下
                f[s|(1<<(i-1))]=f[s];//更新
                leave[s|(1<<(i-1))]=max(leave[s|(1<<(i-1))],leave[s]-a[i]);//
            }
            else if(leave[s]<a[i] && f[s|(1<<(i-1))]>=f[s]+1){//最后一个缆车装不下
                f[s|(1<<(i-1))]    = f[s]+1;
                leave[s|(1<<(i-1))] = max(w-a[i],leave[s|(1<<(i-1))]);
            }
        }
    }
    printf("%d",f[maxn-1]);
    return 0;
}

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,w;
int a[N];
int ans;
int f[1<<18];
int main(){
    scanf("%d%d",&n,&w);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    memset(f,0x3f,sizeof(f));
    int maxn=1<<n;
    f[0]=0;
    //f[1]=0;
    for(ans=1;ans;ans++){
        for(int i=0;i<maxn;i++){
            if(f[i]<=w)f[i]=0;
        }
        for(int i=0;i<maxn;i++){
            if(f[i]<w){
                for(int j=1;j<=n;j++){
                    if(!((i>>(j-1))&1)){
                        f[i|(1<<(j-1))]=min(f[i|(1<<(j-1))],f[i]+a[j]);
                    }
                }
            }
        }
        if(f[maxn-1]<=w){
            printf("%d
",ans);
            //return 0;
            break;
        }
    }
    return 0;
}

 B.猴腮雷:(树形dp★★★)

题目描述:

输入格式 :

 输出格式:

 样例:

样例输入:

 样例输出:

 数据范围与提示:

Code:

#include<bits/stdc++.h>
using namespace std;
const int n=6010;
int N,r[n];
int head[n];
int cnt;
int rd[n];
struct Node{
    int v;
    int ne;
}e[n<<1];
int f[n][2];
void add(int u,int v){
    e[++cnt].v=v;
    e[cnt].ne=head[u];
    head[u]=cnt;
}

void dfs(int rt){
    for(int i=head[rt];i;i=e[i].ne){
        int v=e[i].v;
        dfs(v);
        f[rt][0]+=max(f[v][0],f[v][1]);
        f[rt][1]+=f[v][0];
    }
    f[rt][1]+=r[rt];
}
int k;
int main(){
    scanf("%d",&N);
    for(int i=1;i<=N;i++){
        scanf("%d",&r[i]);
    }
    while(1){
        int x,y;
        scanf("%d%d",&x,&y);
        rd[x]++;
        if(x!=0&&y!=0){
            add(y,x);
        } else {
            break;
        }
    }
    //int rt=0;
    for(int i=1;i<=N;i++){
        if(rd[i]==0)k=i;
    }
    dfs(k);
    printf("%d
",max(f[k][0],f[k][1]));
    return 0;
}

C. 小烈送菜:

题目描述:

输入格式 :

 输出格式:

 样例:

样例输入:

 样例输出:

 数据范围与提示:

分析:

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=2500+5;
int a[N],f[N][N];

int main(){
    int n , ans = 0;
    scanf("%d",&n); 
    for(int i = 1; i <= n; i++)
        scanf("%d",&a[i]);
    for(int i = 1; i <= n; i++){
        for(int j = 1; j < i; j++){
            f[i+1][j]=max(f[i+1][j],f[i][j]+a[i]*a[i+1]);
            f[i+1][i]=max(f[i+1][i],f[i][j]+a[j]*a[i+1]);
        }
    }
    for(int i = 0; i < n; i++)
        ans =max(ans, f[n][i] + a[n] * a[i]);
    printf("%d
",ans); 
    return 0;
}

 D. Siano:

题目描述:

 输入格式:

 样例:

样例输入:

 样例输出:

 数据范围与提示:

 Code:

waiting。。。。。。

原文地址:https://www.cnblogs.com/LightyaChoo/p/13225670.html