1217B.Zmei Gorynich(思维)
你在和一个斯拉夫人传说中凶猛的怪物,一个巨大的龙一样的爬行动物,有多个头!
最初,Zmei Gorynich有x个头像。你可以打n种牌。如果你使用第i种类型的打击,你将Gorynich人头的数量减少最小(di,curX), curX是当前人头的数量。但是如果在这次打击之后,Zmei Gorynich至少有一个头,他就会长出新的头。如果curX=0,那么Gorynich就输了。
你可以以任何顺序,任意次数的打击。
例如,如果curX=10, d=7, h=10,那么正面的数量就会变成13(你切掉7个正面,然后Zmei长出10个新的),但是如果curX=10, d=11, h=100,那么正面的数量就会变成0,Zmei Gorynich就被认为是失败的。
计算击败Zmei Gorynich的最小打击次数!
你必须回答独立的问题。
题解:
其实每次攻击的实际杀伤就是砍掉的头和长出来的头之差。所以可以统计两个最大值,一个是单次攻击的最大值,一个是实际杀伤的最大值。因为一次性打死了就不会长出来了。
如果单次杀伤的最大值大于总头数,那么一次攻击就能完成。
如果单词攻击的最大值小于总头数同时最大的实际杀伤值为0,那么不可能完成,输出-1。
然后贪心,先用最大的攻击力砍一刀,剩下的生命值除r,向上取整,同时再加一刀,这一步还没有理解。
#include<bits/stdc++.h> using namespace std; const int inf=1e9; int T,N,X; int main () { scanf("%d",&T); while (T--) { scanf("%d%d",&N,&X); int l=0; int r=0; for (int i=0;i<N;i++) { int x,y; scanf("%d%d",&x,&y); l=max(l,x); r=max(r,x-y); } if (l>=X) { printf("1\n"); continue; } if (r==0) { printf("-1\n"); continue; } printf("%d\n",(X-l+r-1)/r+1); } }