题目链接:
题意:一个杀手,有m的攻击力,n个敌人。每个敌人有两个属性ai,bi,表示杀死这个敌人需要ai的攻击力,杀死该敌人后,可以再免费杀死bi个其他的敌人而不花费自己的攻击力。求最多可以杀死多少个敌人?在此基础上花费的最少的攻击力是多少?
思路:将所有的敌人分为两类A和B,A是bi值不为0的,B是bi值为0的:
(1)优先杀B类的:用攻击力杀掉尽可能多的B类的,剩余的攻击力若还能杀A类的某一个,则显然,必能将A类得全部干掉,并且还可能有一些可以免费的还可以再接着杀掉B的一些;
6 5
1 0
1 0
1 0
1 0
1 0
5 1
像这组数据,显然优先杀掉B类的是最划算的。。。。
(2)优先杀掉A类的:由于A类的你能干掉其中一个,就可以将A类全部干掉,而且还可以有剩余的免费的还能接着干掉B类的,若攻击力还有,还可以接着杀掉B类得一些,比如这组数据:
6 1
1 5
1 0
1 0
1 0
1 0
1 0
你发现干掉A中的一个后可以用免费的将B类全部干完。这样貌似问题就解决了,但是还有这种情况:
5 7
3 24 15 06 07 0这组数据的答案是5 7.首先用7的攻击力将A类的干掉,用干掉A类得到的3的免费的将B类干掉,也就是说,A类的一些不一定用干掉A的第一个后得到的免费名额。这样的话,首先干掉A类ai值最小的,然后将A类剩余的和B类的一起考虑,每次用自己的攻击力干掉其中ai值最小的。
1 #include2 #include 3 #include 4 #include 5 #include 6 #define min(x,y) ((x)<(y)?(x):(y)) 7 #define max(x,y) ((x)>(y)?(x):(y)) 8 using namespace std; 9 10 struct node 11 { 12 int a,b; 13 14 node(){} 15 node(int _a,int _b) 16 { 17 a=_a; 18 b=_b; 19 } 20 }; 21 22 const int INF=1000000005; 23 const int MAX=100005; 24 vector A,B; 25 int n,m,num=0; 26 int C; 27 28 int cmp(node a,node b) 29 { 30 return a.a =B[i].a) 39 { 40 num1++; 41 cost1+=B[i].a; 42 } 43 44 if(A.size()&&A[0].a<=m) 45 { 46 cost2+=A[0].a; 47 num2=A.size(); 48 for(i=0;i n) num1=n; 58 } 59 60 while(sum>0&&p>=0) sum--,p--,num2++; 61 62 if(p<0) 63 { 64 if(num2>num1||num2==num1&&cost2 =min(A[i].a,B[j].a);) 77 { 78 if(A[i].a<=B[j].a) 79 { 80 cost2+=A[i].a; 81 num2++; 82 p--; 83 i++; 84 } 85 else 86 { 87 cost2+=B[j].a; 88 num2++; 89 j++; 90 } 91 } 92 while(j<=p) 93 { 94 if(m-cost2>=B[j].a) 95 { 96 cost2+=B[j].a; 97 num2++; 98 j++; 99 }100 else break;101 j++;102 }103 if(num2>num1||num2==num1&&cost2