#700 div 2 B

这个啊 我本来想做一个加加我的小分 看了看B 感觉还挺有意思就发出了吧 虽然啥也不是

B.伟大的英雄
测试时间限制2秒
测试512兆字节存储器限制
输入标准输入
输出标准输出
伟大的英雄保卫的国家,荷马的生活。英雄有一个攻击力和初始的健康B。在英雄面前有n个怪物。i-i怪物攻击ai的力量和初始健康比。
英雄或怪物活着,如果他的健康状况良好)【多还是等于1;】;如果他的健康状况不好,那么他就死了)【0】
为了保护国内的人们,英雄将战斗的怪物,直到英雄死了,或者所有的怪物都死了。
在每一个战斗中,英雄可以选择一个任意的活怪物和战斗。假设选择一个怪物,和一个英雄的健康和一个怪物的战斗前,分别为x和y。战斗结束后,英雄的健康和一个怪物的数量分别成为X-ai和Y-A。
注意,英雄可以打同一个怪物几次。
为了国家的人的安全,请告诉他们,一个伟大的英雄是否能杀死所有的怪物)(
输入数据
每个测试包含多个输入数据集。第一行包含t≤1≤t≤105)输入数据集的数量。输入数据集描述如下。
每个输入数据集的第一行包含三个整数的A≤1≤A≤109,B≤1≤B≤109)和n≤1≤n≤105)-攻击伟大英雄的力量,一个伟大的英雄的初始健康和怪物的数量分别。
每一个输入数据集的第二行包含n整数a1,a2爱。(……)1≤ai≤109,其中ai表示攻击i-go怪物的力量。
每一个输入数据集的第三行包含n整数b1,b2©1,≤bi≤109,其中bi代表一个怪物的初始健康值。
保证所有输入数据集的n值不超过105。
输出数据
如果一个伟大的英雄可以杀死所有的怪物,否则你可以把“NO”没有引号。
例子
输入数据
5
3 17 1
2
16
10 999 3
10 20 20
100 50 20
1000 1000 4
200 300 400 500
1000 1000 1000
999 999 1
1000
1000
999 999 1
10000000。
999
周末数据
Yes
Yes
Yes
NO
Yes
说明
第一组输入数据将有六个英雄和唯一的怪物之间的战斗。然后,怪物死了,和英雄的健康数量是17-6×2=5>0。因此,答案是“Yes”,除此之外,英雄还活着。
在第二组输入数据后,所有的怪物都死了,英雄的健康值将是709不管所有战斗的顺序。因此,答案是“Yes”。
在第三组输入数据可能的顺序-战斗1-m,2-m,3-m和4-m的怪物在这个顺序。在所有的战斗后,英雄的健康数量成为-400。不幸的是,英雄死了,但所有的怪物都死了。所以答案是“Yes”。
在第四组输入数据中,英雄是死的,但怪物仍然活着与健康的1000-999=1。因此,答案是“NO”。

思路 对决的时候先和攻击力小的 来pk 不然会有时候会浪费不必要的血量

比如 他10攻击力 你15滴血 他 10滴血 你 5攻击力 那么你要杀他两次 你-5滴血 死了
如果 这时还有一个怪兽 1攻击力 1生命力 你都打不了
如果先打这个 1 那么剩14滴血 还可以跟第一个同归于尽

所以要排序

如果用sort
嗯 我就不说了
2000MS
还是说了

然后我改成优先队列 自动排序 加pair

第一个是攻击力,第二个生命力

#include
#include
#include
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
ll read(){
     ll res = 0, ch, flag = 0;if((ch = getchar()) == '-')flag = 1;else if(ch >= '0' && ch <= '9')res = ch - '0';while((ch = getchar()) >= '0' && ch <= '9' )res = res * 10 + ch - '0';return flag ? -res : res;}
const int maxn =1e6+199 ;
ll sum=0,maxa=-1;
ll n,m,k,w,ans=0,cnt=0;
ll dp[maxn];
//int a[300][300];
//int b[maxn];
ll mod=1e9+7;
map<int,int>mp;
priority_queue< PII,vector<PII>,greater<PII> >q;
ll a[maxn];
ll b[maxn];
typedef struct node{
     
    int g;
    int f;
}ss;
ss e[maxn];
bool cmp(ss a,ss b)
{
     
    return a.f<b.f;
}
int main()
{
     
   n=read();
   while(n--)
   {
     

       k=read();
       m=read();
       w=read();
       for(int i=1;i<=w;i++)
         e[i].g=read();
       for(int i=1;i<=w;i++)
          e[i].f=read();
       for(int i=1;i<=w;i++)
       q.push({
     e[i].g,e[i].f});
  ll t;
          for(int i=1;i<=w;i++)
          {
     

              if(q.top().second%k==0)
              {
     
                  m-=(q.top().second/k)*q.top().first;
              }
              else
              {
     
                  m-=(q.top().second/k+1)*q.top().first;
              }
            if(i==w)
                t=q.top().first;
              q.pop();

          }

          if(m+t>0)
            cout<<"YES"<<endl;
          else
            cout<<"NO"<<endl;
   }


    return 0;
}

你可能感兴趣的:(题目)