• 【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包


    【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包

    题目

    Description

    夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划。今天是7月份,RC又要去商场进货买菠萝包了。
    这次RC总共买了N种菠萝包,每种一个。每个菠萝包都有一个初始美味值Ti,每过一天就会减少Di,即第2天美味值为Ti-Di,第3天为Ti-2*Di,依此类推。一旦美味值减为负数,那个包就坏掉了,不能吃了。
    RC每天都要为夏娜安排当天吃菠萝包的组合,这些组合不是随意的,而是只能从夏娜喜欢的M种搭配中挑选一种。每种搭配是由Ki个菠萝包组成的,一种搭配的总美味值是这Ki个菠萝包当天的美味值之和再加上一个额外的搭配美味值Ei。不过要注意,一旦某种搭配的其中一个菠萝包坏掉了,这个搭配就不能选用了。而且,有可能存在两个搭配,里面的组合是一样的,但额外的搭配美味值却不同。
    RC想让可爱的夏娜尽可能地吃得美味,因此希望能找出一种最优的方案,让小夏娜吃上若干天的菠萝包,这些天的美味值之和最大。
    但RC面临着两个邪恶的敌人,一个叫bug,一个叫zzy,他们也想抢夺这个经纪人之位,因此要是他们提出更优的方案,RC就可能会失去他的夏娜了。那么,你们能帮帮这个可怜的RC吗?

    Input

    输入格式:
    输入文件包含多组数据。
    每组数据的第一行为一个正整数N(N<=14),表示菠萝包的种数,按1-N编号。
    接下来N行,每行两个正整数Ti(Ti<100)和Di(Di<100),表示第i种菠萝包的初始美味值和每天递减值。
    第N+2行为一个正整数M,表示搭配的种数。
    接下来M(M<=20)行,每行先是一个正整数Ki,表示组成这个搭配的菠萝包数目,然后是一个非负整数Ei(Ei<100),表示这种搭配额外的美味值,最后是Ki个整数,每个整数为菠萝包的编号。
    当N=0时表示输入结束。

    Output

    输出格式:
    对于每组输入数据输出一行,仅包含一个整数,表示最大的美味值之和。

    Sample Input

    2
    3 1
    4 2
    2
    1 1 1
    1 1 2
    2
    3 1
    4 2
    3
    1 1 1
    1 1 2
    2 2 1 2
    0

    Sample Output

    8
    9

    Hint

    对于第一个样例,只有两个方案:
    1、 第一天选择搭配1,即吃编号1的菠萝包,美味值为3+1=4;第二天选择搭配2,即吃编号为2的菠萝包,美味值为2+1=3。此时已把菠萝包都吃完了,总和为4+3=7.
    2、 第一天选择搭配2,即吃编号为2的菠萝包,美味值为4+1=5;第二天选择搭配1,即吃编号1的菠萝包,美味值为2+1=3,此时已把菠萝包都吃完了,总和为5+3=8。
    因此,第2个方案为最优方案,最大美味值总和为8.
    对于第二个样例,除了上述两个方案,还有第三个:
    3、 第一天选择搭配3,即编号为1和2的菠萝包一起吃,美味值为3+4+2=9。此时已经把菠萝包都吃完了,总和即为9.
    虽然第3个方案只能吃1天,但因为其总和最大,所以选择第3个方案,答案为9。

    题解

    题意

    给出(n)种面包,每种面包都有一个初始美味和递减值,每天美味值将减去递减值
    (m)种搭配,每种搭配的美味值定义为这种搭配内的每个面包的美味值
    能选择第(i)种搭配当且仅当这种搭配内的所有面包未被选过且美味值大于等于0
    问最大的美味值

    分析

    很显然可以暴力
    每天暴力选取某种搭配,记录答案,更新标记,美味值
    然后取个最大的答案

    Code

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,i,j,ans,a[20],d[20],num[25],c[25],md[25][20];
    bool b[20];
    int read()
    {
        int res;
        char ch;
        ch=getchar();
        res=0;
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9')
        {
            res=(res<<1)+(res<<3)+(ch-'0');
            ch=getchar();
        }
        return res;
    }
    bool judge(int x)
    {
        int i;
        for (i=1;i<=num[x];i++)
            if (b[md[x][i]]==true) return false;
        return true;
    }
    bool pd(int x)
    {
        int i;
        for (i=1;i<=num[x];i++)
            if (a[md[x][i]]<0) return false;
        return true;
    }
    void ins(int x)
    {
        int i;
        for (i=1;i<=num[x];i++)
            b[md[x][i]]=true;
    }
    void del(int x)
    {
        int i;
        for (i=1;i<=num[x];i++)
            b[md[x][i]]=false;
    }
    void inc()
    {
        int i;
        for (i=1;i<=n;i++)
            a[i]+=d[i];
    }
    void dec()
    {
        int i;
        for (i=1;i<=n;i++)
            a[i]-=d[i];
    }
    int get(int x)
    {
        int res,i;
        res=0;
        for (i=1;i<=num[x];i++)
            res+=a[md[x][i]];
        return res;
    }
    void dg(int s)
    {
        if (s>ans) ans=s;
        int i;
        for (i=1;i<=m;i++)
        {
            if (judge(i)==true&&pd(i)==true)
            {
                ins(i);
                s=s+get(i)+c[i];
                dec();
                dg(s);
                inc();
                s=s-get(i)-c[i];
                del(i);
            }
        }
    }
    int main()
    {
        n=read();
        while (n)
        {
            memset(b,false,sizeof(b));
            for (i=1;i<=n;i++)
                a[i]=read(),d[i]=read();
            m=read();
            for (i=1;i<=m;i++)
            {
                num[i]=read();c[i]=read();
                for (j=1;j<=num[i];j++)
                    md[i][j]=read();
            }
            ans=0;
            dg(0);
            printf("%d
    ",ans);
            n=read();
        }
        return 0;
    }
    
  • 相关阅读:
    Atcoder Grand Contest 038 F
    洛谷 P5502
    Codeforces 1010F
    洛谷 P4621
    洛谷 P5518
    Oracle-切换当用用户的模式
    Oracle-DBV数据文件校验工具
    【转载】Oracle-通过增量备份前滚的反手解决物理备库归档缺失,损坏,gap问题
    Oracle-对比SAA与STA
    Oracle-SAA
  • 原文地址:https://www.cnblogs.com/Livingston/p/13470520.html
Copyright © 2020-2023  润新知