• loj #2021. 「AHOI / HNOI2017」大佬


    #2021. 「AHOI / HNOI2017」大佬

     

    题目描述

    人们总是难免会碰到大佬。他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语。你作为一个 OIer,面对这样的事情非常不开心,于是发表了对大佬不敬的言论。 大佬便对你开始了报复,你也不示弱,扬言要打倒大佬。现在给你讲解一下什么是大佬,大佬除了是神犇以外,还有着强大的自信心,自信程度可以被量化为一个正整数 CCC,想要打倒一个大佬的唯一方法是摧毁 Ta 的自信心,也就是让大佬的自信值等于 000(恰好等于 000,不能小于 000)。由于你被大佬盯上了,所以你需要准备好 nnn 天来和大佬较量,因为这 nnn 天大佬只会嘲讽你动摇你的自信,到了第 n+1n+1n+1 天,如果大佬发现你还不服,就会直接虐到你服,这样你就丧失斗争的能力了。

    你的自信程度同样也可以被量化,我们用 mcmathrm{mc}mc 来表示你的自信值上限。在第 i (i≥1)i (ige 1)i (i1) 天,大佬会对你发动一次嘲讽,使你的自信值减小 aia_iai​​,如果这个时刻你的自信值小于 000了,那么你就丧失斗争能力,也就失败了(特别注意你的自信值为 000 的时候还可以继续和大佬斗争)。 在这一天,大佬对你发动嘲讽之后,如果你的自信值仍大于等于 000,你能且仅能选择如下的行为之一:

    1. 还一句嘴,大佬会有点惊讶,导致大佬的自信值 CCC 减小 111。
    2. 做一天的水题,使得自己的当前自信值增加 wiw_iwi​​,并将新自信值和自信值上限 mcmathrm{mc}mc 比较,若新自信值大于 mcmathrm{mc}mc,则新自信值更新为 mcmathrm{mc}mc。例如,mc=50mathrm{mc} = 50mc=50,当前自信值为 404040,若 wi=5w_i = 5wi​​=5,则新自信值为 454545,若 wi=11w_i = 11wi​​=11,则新自信值为 505050。
    3. 让自己的等级值 LLL 加 111。
    4. 让自己的讽刺能力 FFF 乘以自己当前等级 LLL,使讽刺能力 FFF 更新为 F⋅LFcdot LFL。
    5. 怼大佬,让大佬的自信值 CCC 减小 FFF。并在怼完大佬之后,你自己的等级 LLL 自动降为 000,讽刺能力 FFF 降为 111。由于怼大佬比较掉人品,所以这个操作只能做不超过两次。

    特别注意的是,在任何时候,你不能让大佬的自信值为负,因为自信值为负,对大佬来说意味着屈辱,而大佬但凡遇到屈辱就会进化为更厉害的大佬直接虐飞你。在第 111 天,在你被攻击之前,你的自信是满的(初始自信值等于自信值上限 mcmathrm{mc}mc),你的讽刺能力 FFF 是 111,等级是 000。

    现在由于你得罪了大佬,你需要准备和大佬正面杠,你知道世界上一共有 mmm 个大佬,他们的嘲讽时间都是 nnn 天,而且第 iii 天的嘲讽值都是 aia_iai​​。不管和哪个大佬较量,你在第 iii 天做水题的自信回涨都是 wiw_iwi​​。这 mmm 个大佬中只会有一个来和你较量(nnn 天里都是这个大佬和你较量),但是作为你,你需要知道对于任意一个大佬,你是否能摧毁他的自信,也就是让他的自信值恰好等于 000。和某一个大佬较量时,其他大佬不会插手。

    输入格式

    第一行三个正整数 n,m,mcn,m,mathrm{mc}n,m,mc。分别表示有 nnn 天和 mmm 个大佬,你的自信上限为 mcmathrm{mc}mc。
    接下来一行是用空格隔开的 nnn 个数,其中第 i(1≤i≤n)i(1le ile n)i(1in) 个表示 aia_iai​​。
    接下来一行是用空格隔开的 nnn 个数,其中第 i(1≤i≤n)i(1le ile n)i(1in) 个表示 wiw_iwi​​。
    接下来 mmm 行,每行一个正整数,其中第 k(1≤k≤m)k(1le kle m)k(1km) 行的正整数 CkC_kCk​​ 表示第 kkk 个大佬的初始自信值。

    输出格式

    共 mmm 行,如果能战胜第 kkk 个大佬(让他的自信值恰好等于 0),那么第 kkk 行输出 111,否则输出 000。

    样例

    样例输入

    30 20 30
    15 5 24 14 13 4 14 21 3 16 7 4 7 8 13 19 16 5 6 13 21 12 7 9 4 15 20 4 13 12
    22 21 15 16 17 1 21 19 11 8 3 28 7 10 19 3 27 17 28 3 26 4 22 28 15 5 26 9 5 26
    30
    10
    18
    29
    18
    29
    3
    12
    28
    11
    28
    6
    1
    6
    27
    27
    18
    11
    26
    1

    样例输出

    0
    1
    1
    0
    1
    0
    1
    1
    0
    0
    0
    1
    1
    1
    1
    1
    1
    0
    0
    1

    数据范围与提示

    对于 20%20\%20% 的数据,1≤n≤101le nle 101n10;
    另有 20%20\%20% 数据,1≤Ci,n,mc≤301le C_i,n,mathrm{mc}le 301Ci​​,n,mc30;
    对于 100%100\%100% 的数据,1≤n,mc≤100,1≤m≤20;1≤ai,wi≤mc,1≤Ci≤1081le n, mathrm{mc}le 100, 1le mle 20; 1le a_i, w_ilemathrm{mc}, 1le C_ile 10^81n,mc100,1m20;1ai​​,wi​​mc,1Ci​​108​​。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 50
    using namespace std;
    int n,m,mc,a[maxn],w[maxn],c,res;
    void dfs(int pos,int L,int F,int C,int cc,int t){
        cc-=a[pos];
        if(C==0){res=1;return;}
        if(cc<0)return;
        if(C<0)return;
        if(res)return;
        if(pos==n+1)return;
        dfs(pos+1,L,F,C-1,cc,t);
        dfs(pos+1,L,F,C,min(mc,cc+w[pos]),t);
        dfs(pos+1,L+1,F,C,cc,t);
        dfs(pos+1,L,F*L,C,cc,t);
        if(t<2)dfs(pos+1,0,1,C-F,cc,t+1);
    }
    bool work(){
        res=0;
        dfs(1,0,1,c,mc,0);
        return res;
    }
    int main(){
        scanf("%d%d%d",&n,&m,&mc);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&w[i]);
        while(m--){
            scanf("%d",&c);
            printf("%d
    ",work());
        }
        return 0;
    }
    40分 暴力
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 110
    using namespace std;
    int n,m,mc,dp[maxn][maxn],U,d,a[maxn],w[maxn],c[maxn],v[1000010];
    char s[100000010];
    void dfs(int x,int L,int F){
        if(x>d)return;
        if(1LL*(L+1)*F<=U)dfs(x+1,L+1,F);
        if(L&&1LL*L*F<=U){
            if(!s[1LL*L*F]||s[1LL*L*F]>x)
            s[L*F]=x,dfs(x+1,L,1LL*F*L);
        }
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        scanf("%d%d%d",&n,&m,&mc);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&w[i]);
        memset(dp,-1,sizeof(dp));
        dp[1][mc]=0;
        for(int i=1;i<=n;i++)
            for(int j=a[i];j<=mc;j++){
                if(dp[i][j]==-1)continue;
                int k=min(j-a[i]+w[i],mc);
                dp[i+1][k]=max(dp[i+1][k],dp[i][j]);
                dp[i+1][j-a[i]]=max(dp[i+1][j-a[i]],dp[i][j]+1);
            }
        for(int i=1;i<=n+1;i++)
            for(int j=0;j<=mc;j++)d=max(d,dp[i][j]);
        for(int i=1;i<=m;i++){
            scanf("%d",&c[i]);
            U=max(U,c[i]);
        }
        dfs(1,0,1);
        for(int i=1;i<=U;i++)
            if(s[i])v[++v[0]]=i;
        for(int k=1;k<=m;k++){
            bool flag=0;
            for(int j=1;j<=v[0] && !flag && v[j]<=c[k];j++)
                if(d+v[j]-s[v[j]]-1>=c[k])flag=1;
            for(int i=0;i<=d&&!flag;i++)
                for(int j=1;!flag&&j<=v[0]&&i+v[j]<=c[k];j++)
                if(s[c[k]-v[j]-i]&&i+s[v[j]]+s[c[k]-v[j]-i]+2<=d)flag=1;
            printf("%d
    ",flag);
        }
        return 0;
    }
    100分 dp
  • 相关阅读:
    ios framework 使用图片资源
    XCode 6.4 Alcatraz 安装的插件不可用
    prefix pch 中引用cocoapods 中的头文件失败
    Xcode 6添加模板无效
    获取当前日期是星期几
    玩转iOS开发:《使用系统自带的UIActivityViewController和UIActivity进行内容分享》
    玩转iOS开发:《iOS设计模式 — 代理模式》
    玩转iOS开发:《iOS设计模式 — 单例模式》
    iOS开发技巧-Swift版本: 3.Storyboard传参小技巧
    UIKit应用
  • 原文地址:https://www.cnblogs.com/thmyl/p/8886215.html
Copyright © 2020-2023  润新知