CodeForces - 1060D Social Circles 貪心
谷歌翻譯+修改:
你邀請了n位客人吃飯!您計劃安排一個或多個椅子。每把椅子要麼由一位客人佔用,要麼是空的。你可以製作任意數量的桌子。 你的客人碰巧有點害羞,所以第i位客人希望在他的椅子左邊至少有li把空閒的椅子,並且至少有ri空閒的椅子在右邊。選擇“左”和“右”方向,假設所有客人將坐向圓桌的中心。請注意,當一個客人是他圓桌上的唯一的一個人時,左邊的椅子和他右邊的椅子可能會重疊。 您必須使用的最小椅子總數是多少?
通俗來說,就是說有 n 個單身狗來吃飯,矯情的dog們希望自己左邊有 L 把空椅子,右邊有 R 把椅子(活該單身),讓你給他們安排桌子和椅子
我不安排,此題完
每個桌子可以只有一人,因為是圓桌,只有一人的時候左右空椅子可以重疊,問你需要的最少的椅子數(買不起椅子嗎???)
思路:算是貪心吧(我還沒學這個QAQ)求最優解
我們把這些人放一起,每個人左邊空椅子(記為 L ) 和右邊空椅子(記為 R )分別放在一起進行從大到小的排序,從最大的開始取,(第一個人的 R 可以和其他人的 L 重疊,符合題意哦)取每組最大的,這樣將椅子數降為最小
誒,那L 和 R是一個人的咋辦,不要忘了只有一人的時候左右空椅子可以重疊,取 L 和 R 二者最大就好, 讓他自己一個桌子,一人吃全桌,真好
總的來說,就是將輸入的 L 和 R 分別存在兩個數組裡 ,分別進行從大到小的排序(emmmmmm從小到大也行吧=-=當時不知道怎麼想的就是從大到小了,反正都能AC,就當練了一下sort函式的使用吧 balabalabala),取每組最大的加起來,最後不要忘了上面求得這個和是空椅子的,我們還要加上人數(你不讓客人坐了啊?)
你也可以理解為:一個大桌子,往裡插人
廢話少說(嗯,雖然說了這麼多廢話了。。。)
關門,放AC程式碼:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define clc(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
#define s(n) int n; scanf("%d", &n)
#define w(n) int n; while(scanf("%d", &n) != EOF)
using namespace std;
bool cmp(LL a, LL b){
return a > b;
}
int main(void){
s(n);
LL sum = 0;
LL left[100005], right[100005];
_for(i, 0, n) scanf("%lld%lld", &left[i], &right[i]);
sort(left, left + n, cmp);
sort(right, right + n, cmp);
_for(i, 0, n) sum += max(left[i], right[i]);
printf("%lld\n", sum + n);
return 0;
}
2018.11.17 20:09 寫於週末冷清的寢室