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  写于周末冷清的寝室

猜你喜欢

转载自blog.csdn.net/qq_43005180/article/details/84191755
今日推荐