zoukankan      html  css  js  c++  java
  • JZOJ 辽哥游戏

    Description

      张辽是一个长发飘飘的非常聪明的男孩,人人都称他为“辽哥”。辽哥喜欢玩一个有趣的电脑游戏。这个游戏开始的时候有n个碉堡,每个碉堡拥有一个防御值和一个附加值。玩家拥有一个初始的攻击力。如果玩家破坏了一个碉堡,则他能得到1分。每一次,辽哥会选择一个碉堡进行攻击。所有未被破坏的碉堡会联合起来防御,因此为了破坏那个碉堡,辽哥的攻击力必须大于或者等于所有未被破坏的碉堡的防御值之和,否则辽哥就会输掉游戏。如果辽哥成功破坏了那个碉堡,那么他的攻击力会变成那个碉堡的附加值,然后他可以选择下一个攻击的目标。
      由于辽哥拥有强大的编程能力,他不费吹灰之力就改写了那个游戏。在游戏开始前,他可以用炸弹消灭任意的碉堡,但是他不能通过这种方式来获得分数。问题来了,在游戏开始后,辽哥可以得到的最大分数是多少?
     

    Input

      输入包含多组(不超过100组)测试数据。
      每组测试数据的第一行包含一个正整数N,表示测碉堡的数目。接下来有N行,每行包括2个非负整数。第i+1行的2个整数分别表示第i个碉堡的防御值和附加值。最后还有一行,为一个整数,表示辽哥在游戏开始时的初始攻击力。
      输入以文件结束符结束。

    Output

      对每组数据,输出一行,为一个整数,表示辽哥可以拿到的最大分数。
     

    Sample Input

    3
    10 9
    25 30
    8 7
    50
    5
    100 230
    334 331
    33 288
    35 100
    334 22
    600

    Sample Output

    3
    4
     

    Data Constraint

     
     

    Hint

    【数据范围】
      对20%的数据,有N<=10;
      对40%的数据,有N<=100;
      对100%的数据,有N<=1000,每个碉堡的防御值和附加值均不会超过2000000。

    Description

      张辽是一个长发飘飘的非常聪明的男孩,人人都称他为“辽哥”。辽哥喜欢玩一个有趣的电脑游戏。这个游戏开始的时候有n个碉堡,每个碉堡拥有一个防御值和一个附加值。玩家拥有一个初始的攻击力。如果玩家破坏了一个碉堡,则他能得到1分。每一次,辽哥会选择一个碉堡进行攻击。所有未被破坏的碉堡会联合起来防御,因此为了破坏那个碉堡,辽哥的攻击力必须大于或者等于所有未被破坏的碉堡的防御值之和,否则辽哥就会输掉游戏。如果辽哥成功破坏了那个碉堡,那么他的攻击力会变成那个碉堡的附加值,然后他可以选择下一个攻击的目标。
      由于辽哥拥有强大的编程能力,他不费吹灰之力就改写了那个游戏。在游戏开始前,他可以用炸弹消灭任意的碉堡,但是他不能通过这种方式来获得分数。问题来了,在游戏开始后,辽哥可以得到的最大分数是多少?
     

    Input

      输入包含多组(不超过100组)测试数据。
      每组测试数据的第一行包含一个正整数N,表示测碉堡的数目。接下来有N行,每行包括2个非负整数。第i+1行的2个整数分别表示第i个碉堡的防御值和附加值。最后还有一行,为一个整数,表示辽哥在游戏开始时的初始攻击力。
      输入以文件结束符结束。

    Output

      对每组数据,输出一行,为一个整数,表示辽哥可以拿到的最大分数。
     

    Sample Input

    3
    10 9
    25 30
    8 7
    50
    5
    100 230
    334 331
    33 288
    35 100
    334 22
    600

    Sample Output

    3
    4
     

    Data Constraint

     
     

    Hint

    【数据范围】
      对20%的数据,有N<=10;
      对40%的数据,有N<=100;
      对100%的数据,有N<=1000,每个碉堡的防御值和附加值均不会超过2000000。

    先考虑如果知道破坏碉堡顺序,我们考虑如何最优

    显然令f[i]表示一开始有i的能力的最优非常不方便转移

    我们考虑令f[i]表示破坏i个碉堡需要的最小能力值,f[0]=0

    那么,f[i]=f[i-1]+A[j](B[j]>=f[i-1]) O(N^2)暴力做即可,最后二分出最大的i满足f[i]<=S

    好的现在来考虑如何排序

    考虑两个状态i,i+1

    i和i+1不能交换的充分条件:b[i+1]<a[i]+Σa[j] (j>i+1)

    同时我们还有条件b[i]>=a[i+1]+Σa[j] (j>i+1)

    两式相减得到:b[i+1]-b[i]<a[i]-a[i+1]

    b[i+1]+a[i+1]<a[i]+b[i]

    所以我们只需要按照a[i]+b[i]的顺序排序即可

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int n,m,f[1010];
    struct p{ int a,b; } s[1010];
    inline bool c1(p a,p b){ return a.a+a.b>b.a+b.b; }
    int _18520(){
    	if(~scanf("%d",&n)){
    		for(int i=n;i;--i) scanf("%d %d",&s[i].a,&s[i].b);
    		sort(s+1,s+1+n,c1); memset(f,0x3f,sizeof f); f[0]=0;
    		for(int i=n;i;--i) for(int j=n;j;--j)
    				if(s[i].b>=f[j-1]) f[j]=min(f[j],f[j-1]+s[i].a);
    		scanf("%d",&m); 
    		for(int t=n;~t;--t) if(f[t]<=m) return printf("%d
    ",t);
    	} return 0;
    }
    int main(){ while(_18520()); }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10741457.html
Copyright © 2011-2022 走看看