zoukankan      html  css  js  c++  java
  • Luogu P2123 皇后游戏(贪心)

    题目链接:P2123 皇后游戏
    如果证明这个题为什么是贪心的话,我是不会的,但是一看这个题目就是一个贪心,然后满足贪心的性质:
    都能从两个人(东西)扩展到n个人(东西)
    一定能从相邻状态扩展到不相邻的状态
    ---摘自rain_falls
    其实就是满足贪心的题目一定满足两个人的情况,就是由两个人推广到n个人.
    我们先想一下两个人时的情况.
    答案就是这个:
    (min(max(a_1+b1,a_1+a_2)+b_2,max(a_2+b_2,a_1+a_2)+b_1))
    如果前一项小那么就让第一个人排在前面,第二个人排在后面.
    反之.

    #include <iostream>
    #include <algorithm> 
    #include <cstdio>
    #define ll long long
    const ll maxN = 20000 + 7;
    using namespace std;
    
    struct Node{
    	ll a,b;
    }Map[maxN];
    ll val[maxN];
    
    bool cmp(Node a,Node b) {
    	return max(a.a + a.b,a.a + b.a) + b.b < max(b.a+b.b,a.a+b.a)+ a.b;
    }
    
    int main() {
    	ll T;
    	cin >> T;
    	while(T --) {
    		ll ans = 0;
    		ll n;
    		cin >> n;
    		for(ll i = 1;i <= n;++ i) 
    			cin >> Map[i].a >> Map[i].b;
    		sort(Map + 1,Map + n + 1,cmp);
    		ll sum = Map[1].a;
    		val[1] = Map[1].a + Map[1].b;
    		ans = val[1];
    		for(ll i = 2;i <= n;++ i) {
    			sum += Map[i].a;
    			val[i] = max(val[i - 1],sum) + Map[i].b;
    			ans = max(val[i],ans); 
    		}	
    		printf("%lld
    ",ans);
    	}
    }
    

    NOIP中关于贪心的题最难的一步就是发现它是个贪心233.

  • 相关阅读:
    斐波那契数列
    用两个栈实现队列
    从尾到头打印链表
    HDOJ5877(dfs序+离散化+树状数组)
    HDOJ5876(补图的最短路)
    POJ3090(欧拉函数)
    POJ2478(欧拉函数)
    POJ2407(欧拉函数)
    POJ2142(扩展欧几里得)
    POJ3020(最小边覆盖)
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9524378.html
Copyright © 2011-2022 走看看