谷歌翻译+修改:
你邀请了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 写于周末冷清的寝室