zoukankan      html  css  js  c++  java
  • [HNOI2017]大佬

    题目描述

    人们总是难免会碰到大佬。他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语。 你作为一个 OIER,面对这样的事情非常不开心,于是发表了对大佬不敬的言论。 大佬便对你开始了报复,你也不示弱,扬言要打倒大佬。

    现在给你讲解一下什么是大佬,大佬除了是神犇以外,还有着强大的自信心,自信程度可以被量化为一个正整数 C( 1<=C<=10^8), 想要打倒一个大佬的唯一方法是摧毁 Ta 的自信心,也就是让大佬的自信值等于 0(恰好等于 0,不能小于 0)。 由于你被大佬盯上了,所以你需要准备好 n(1<=n<=100)天来和大佬较量,因为这 n 天大佬只会嘲讽你动摇你的自信,到了第n+1 天,如果大佬发现你还不服,就会直接虐到你服,这样你就丧失斗争的能力了。

    你的自信程度同样也可以被量化,我们用 mc (1 <= mc <= 100)来表示你的自信值上限。

    在第 i 天( i>=1),大佬会对你发动一次嘲讽,使你的自信值减小 a[i],如果这个时刻你的自信值小于 0 了,那么你就丧失斗争能力,也就失败了(特别注意你的自信值为 0 的时候还可以继续和大佬斗争)。 在这一天, 大佬对你发动嘲讽之后,如果你的自信值仍大于等于 0,你能且仅能选择如下的行为之一:

    1. 还一句嘴,大佬会有点惊讶,导致大佬的自信值 C 减小 1。

    2. 做一天的水题,使得自己的当前自信值增加 w[i], 并将新自信值和自信值上限 mc 比较,若新自信值大于 mc,则新自信值更新为 mc。例如, mc=50, 当前自信值为 40, 若w[i]=5,则新自信值为 45,若 w[i]=11,则新自信值为 50。

    3. 让自己的等级值 L 加 1。

    4. 让自己的讽刺能力 F 乘以自己当前等级 L,使讽刺能力 F 更新为 F*L。

    5. 怼大佬,让大佬的自信值 C 减小 F。并在怼完大佬之后,你自己的等级 L 自动降为 0,讽刺能力 F 降为 1。由于怼大佬比较掉人品,所以这个操作只能做不超过 2 次。

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

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

    输入输出格式

    输入格式:

    第一行三个正整数 n,m,mc。分别表示有 n 天和 m 个大佬, 你的自信上限为 mc。

    接下来一行是用空格隔开的 n 个数,其中第 i(1<=i<=n)个表示 a[i]。

    接下来一行是用空格隔开的 n 个数,其中第 i(1<=i<=n)个表示 w[i]。

    接下来 m 行,每行一个正整数,其中第 k(1<=k<=m)行的正整数 C[k]表示第 k 个大佬的初始自信值。

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    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
    输出样例#1: 复制
    0
    1
    1
    0
    1
    0
    1
    1
    0
    0
    0
    1
    1
    1
    1
    1
    1
    0
    0
    1

    说明

    20%数据保证: 1≤n≤10。

    另有 20%数据保证:1 ≤ C[i],n,mc ≤ 30。

    100%数据保证: 1 ≤ n,mc ≤ 100; 1≤m≤20; 1≤a[i],w[i]≤mc; 1≤C[i] ≤10^8

    思维大火题.
    题目大概是这个意思:
    你要去和大佬搞架,大佬有一定的血量,你也有一定的血量.
    在每回合中,攻速快的大佬会先对你造成ai点伤害,若你还没有死,你可以发动以下操作:
    1.A造成1点伤害.
    2.使用Q技能恢复wi点血量.
    3.使用W技能升一级.
    4.使用E技能蓄力.
    5.开大招R(仅限两次).
    问你能不能把大佬恰好砍死.
    真可以出游戏了..
    首先挖掘性质,发现除了Q技能,其他技能在哪些回合用都是不受影响的,那么就可以求出最多能够有多少回合不需要用Q技能.(不死的前提下).
    然后发现大招只能用两次,分三种情况考虑.
    1.不用大招,那么就看能否A.
    2.用一次大招.这时需要求出大招能打出某点伤害的最小回合数,这个用广搜+哈希挂链即可(map在洛谷上过不了).
    求出这个东西就可以直接枚举大招打出的血量即可.
    3.两次大招肯定不能直接枚举了,考虑把所有方式按照打出的血量从小到大排序,设两次大招打出的血量分别为f1,f2.所需回合分别为d1,d2.
    那么能够刚好砍死的条件为:f1+f2+天数-d1-d2>=C.
    f2-d2>=C-tot+d1-f1.(f1+f2<=C)
    不难看出,这个条件是有单调性的,那么双指针扫一遍,中途记录f2-d2的最大值即可.

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<algorithm>
     7 #include<map>
     8 #include<complex>
     9 #include<queue>
    10 #include<stack>
    11 #include<cctype>
    12 #include<cmath>
    13 #include<set>
    14 #include<vector>
    15 #define inf 100000000
    16 #define RG register
    17 #define mk make_pair
    18 #define pb push_back
    19 #define fi first
    20 #define se second
    21 #define UN unsigned
    22 #define LL long long
    23 #define MOD 9875321
    24 using namespace std;
    25 typedef pair<int,int> P;
    26 int a[110],w[110],f[110][110],n,m,mc,tot,sz=0,edge=0,head[10000000];
    27 P way[2000010];
    28 struct data{int day,fi,se;};
    29 struct EG{int nex,x,y;}e[2000010];
    30 queue<data>q;
    31 inline int prepare(){ //预处理最多能刚多少天.
    32   memset(f,127/3,sizeof(f));int ans=0;
    33   f[0][mc]=0;
    34   for(int i=1;i<=n;i++)
    35     for(int j=0;j<=mc-a[i];j++){
    36       f[i][j]=min(f[i][j],f[i-1][j+a[i]]);
    37       f[i][min(mc,j+w[i])]=min(f[i][min(mc,j+w[i])],f[i-1][j+a[i]]+1);
    38     }
    39   for(int i=1;i<=n;i++)
    40     for(int j=0;j<=mc;j++) ans=max(ans,i-f[i][j]);
    41   return ans;
    42 }
    43 inline void add(RG int x,RG int y){
    44   RG int k=((LL)x*101+y)%MOD;
    45   e[++edge]=(EG){head[k],x,y};head[k]=edge;
    46 }
    47 inline bool ask(RG int x,RG int y){
    48   RG int k=((LL)x*101+y)%MOD;
    49   for(int i=head[k];i;i=e[i].nex)if(e[i].x==x && e[i].y==y) return 1;
    50   return 0;
    51 }
    52 inline void BFS(){
    53   q.push((data){1,1,0});
    54   while(!q.empty()){
    55     RG data u=q.front();q.pop();
    56     if(u.day==tot) continue;
    57     RG data v=u;v.se++,v.day++;q.push(v);
    58     if(u.se<=1 || ((LL)u.fi*u.se>inf) || ask(u.fi*u.se,u.se)) continue;
    59     v=u,v.fi*=v.se,v.day++;q.push(v);
    60     add(v.fi,v.se);
    61     way[++sz]=mk(v.fi,v.day);
    62   }
    63 }
    64 inline bool cmp(const P &A,const P &B){ return A.fi<B.fi;}
    65 int main(){
    66   freopen("!.in","r",stdin);
    67   freopen("!.out","w",stdout);
    68   scanf("%d%d%d",&n,&m,&mc);
    69   for(RG int i=1;i<=n;i++) scanf("%d",a+i);
    70   for(RG int i=1;i<=n;i++) scanf("%d",w+i);
    71   tot=prepare();
    72   BFS();
    73   sort(way+1,way+sz+1,cmp);
    74   for(RG int ii=1,C;ii<=m;ii++){
    75     scanf("%d",&C);
    76     if(tot==0) {puts("0");continue;}
    77     if(C<=tot) {puts("1");continue;}
    78     int flag=0;
    79     for(RG int i=sz,j=1,mx=-inf;i>0;i--){
    80       if(way[i].fi>C) continue;
    81       while(way[j].fi+way[i].fi<=C && j<=sz){
    82     if(way[j].fi-way[j].se>=mx)mx=way[j].fi-way[j].se;
    83     j++;
    84       }
    85       if(mx>=C-tot+way[i].se-way[i].fi) {flag=1;break;}
    86       if(way[i].fi+tot-way[i].se>=C){flag=1;break;}
    87     }
    88     printf("%d
    ",flag);
    89   }
    90   return 0;
    91 }
  • 相关阅读:
    ubuntu 制做samba
    《Programming WPF》翻译 第4章 前言
    《Programming WPF》翻译 第4章 3.绑定到数据列表
    《Programming WPF》翻译 第4章 4.数据源
    《Programming WPF》翻译 第5章 6.触发器
    《Programming WPF》翻译 第4章 2.数据绑定
    《Programming WPF》翻译 第4章 1.不使用数据绑定
    《Programming WPF》翻译 第5章 7.控件模板
    《Programming WPF》翻译 第5章 8.我们进行到哪里了?
    《Programming WPF》翻译 第5章 5.数据模板和样式
  • 原文地址:https://www.cnblogs.com/pantakill/p/7923207.html
Copyright © 2011-2022 走看看