zoukankan      html  css  js  c++  java
  • 【BZOJ3709】 [PA2014]Bohater(贪心)

    传送门

    BZOJ

    Solution

    考虑如果可以回血肯定要打,那么就是按照伤害值从小到大排个序能打就打,不能打就(NIE)
    接着看不能够回血的,emmm,把这个过程反着看一下就是打一个怪扣(a_I)的血,加(d_i)的血。
    咦?怎么和上面那一个一样啊?然后就可以解决了!

    代码实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #include<iostream>
    using namespace std;
    #define re register
    #define ll long long
    #define int ll
    inline int gi()
    {
    	int f=1,sum=0;char ch=getchar();
    	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    	return f*sum;
    }
    const int N=100010;
    struct node
    {
    	int d,a,id;
    }a[N],live[N],fuck[N];
    int n,z,q1,q2;
    bool cmp1(node a,node b)
    {
    	return a.d<b.d;
    }
    bool cmp2(node a,node b)
    {
    	return a.a<b.a;
    }
    void naive()
    {
    	puts("NIE");
    	exit(0);
    }	  
    signed main()
    {
    	n=gi(),z=gi();int lz=z;
    	for(int i=1;i<=n;i++){a[i].id=i;a[i].d=gi(),a[i].a=gi();lz=lz-a[i].d+a[i].a;}
    	for(int i=1;i<=n;i++)
    		if(a[i].d<=a[i].a)live[++q1]=a[i];
    		else fuck[++q2]=a[i];
    	sort(live+1,live+q1+1,cmp1);
    	for(int i=1;i<=q1;i++)
    	{
    		if(z<=live[i].d)naive();
    		z-=live[i].d;z+=live[i].a;
    	}
    	sort(fuck+1,fuck+q2+1,cmp2);
    	for(int i=1;i<=q2;i++)
    	{
    		if(lz<=fuck[i].a)naive();
    		lz-=fuck[i].a;lz+=fuck[i].d;
    	}
    	puts("TAK");
    	for(int i=1;i<=q1;i++)
    		printf("%lld ",live[i].id);
    	for(int i=q2;i;--i)
    		printf("%lld ",fuck[i].id);
    	puts("");
    	return 0;
    }
    
  • 相关阅读:
    汇编 gdb调试
    汇编 运行错误解决办法
    binutils安装
    汇编错误
    汇编
    pthread_create()
    error2019-01-17 宏STDOUT_FILENO
    2019-01-17 跳至首行
    .NET MVC 两种视图引擎(Razor、Aspx)
    ECharts属性设置
  • 原文地址:https://www.cnblogs.com/mleautomaton/p/10568959.html
Copyright © 2011-2022 走看看