• [BZOJ 4977][Lydsy1708月赛]跳伞求生


    题目传送-BZOJ1708

    题意:

    (m)个敌人,每个敌人有2个属性((b,c)),表示打死他要花费b个子弹,获得c的收益
    (n)个队友,每个队友有(a)个子弹
    一个敌人(j)能被(i)打死当且仅当(a_i ge b_j),总收益为(a_i-b_j+c_j)
    安排哪个人打哪个敌人,输出最大收益
    (n,m,a,b,cle100000)

    题解:

    每个敌人的贡献独立:(val_j=c_j-b_j)
    每个队友的贡献也独立,等于(a_i)
    考虑贪心,尽量选价值最大的敌人和队友
    先把它们按价值降序排序
    对每个敌人,用恰好能打死他的,没安排过的人打死,收益最大

    过程:

    STL的锅发现一个:
    AC:

    		it=key.upper_bound(e[i].bd);
    

    TLE:

    		it=upper_bound(key.begin(),key.end(),e[i].bd);
    

    代码:

    const int N=100010;
    int n,m;
    struct ENEMY {
    	int bd,val;
    	inline void in() {
    		read(bd); int x; read(x);
    		val=x-bd;
    	}
    	bool operator < (const ENEMY &a)const {
    		return val>a.val;
    	}
    }e[N];
    int a[N];
    bool cmp(const int &a,const int &b) {
    	return a>b;
    }
    // priority_queue<int,std::vector<int>,greater<int> >pq;
    int cnt[N]; set<int> key;
    int seq[N],ind;
    inline void OLE() {
    	int cnt=100000;
    	while(cnt--) puts("F**K");
    	return; 
    }
    signed main() {
    	read(n); read(m);
    	for(int i=1;i<=n;i++) read(a[i]);
    	for(int i=1;i<=m;i++) e[i].in();
    	sort(a+1,a+n+1,cmp); sort(e+1,e+m+1);
    	for(int i=1;i<=n;i++) ++cnt[a[i]],key.insert(a[i]);
    	for(int i=1;i<=m;i++) {
    		if(key.empty()) break;
    		set<int> :: iterator it;
    		it=key.upper_bound(e[i].bd);
    		if(it==key.end()) continue;
    		int val=*it;
    		if(--cnt[val]==0) key.erase(it);
    		if(cnt[val]<0) {OLE(); return 0;}
    		seq[++ind]=e[i].val;
    	}
    	ll ans=0;
    	for(int i=ind;i>=1;i--) {
    		int v=a[i]+seq[i];
    		if(v<0) continue;
    		ans+=0ll+v;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    /*
    6 3
    1 2 3 4 5 6
    5 3
    3 5
    4 3
    
    
    3 3
    4 4 4
    2 3
    1 3
    5 3
    */
    

    用时:30min

  • 相关阅读:
    机器学习:SVM(核函数、高斯核函数RBF)
    机器学习:SVM(非线性数据分类:SVM中使用多项式特征和核函数SVC)
    LeetCode566. Reshape the Matrix
    LeetCode 128. Longest Consecutive Sequence
    # 线程安全 & 线程安全函数 & 线程不安全函数
    Linux进程状态
    C++ 4种强制类型转换
    TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复
    LeetCode 69. Sqrt(x)
    LeetCode543. Diameter of Binary Tree
  • 原文地址:https://www.cnblogs.com/functionendless/p/9457864.html
Copyright © 2020-2023  润新知