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()); }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    Charpter5 软件测试总结
    Charpter3 关于闰年测试
    Charpter2 新的测试用例
    Charpter1 等价类划分方法分析与应用
    软件测试第一周学习总结
    关于软件测试学习的心得
    软件测试-同行评审
    白盒测试
    黑盒测试
    Java实现的闰年测试程序
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10741457.html
Copyright © 2011-2022 走看看