算法系列学习codeforces D. Mike and distribution 二维贪心

Posted shulin~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法系列学习codeforces D. Mike and distribution 二维贪心相关的知识,希望对你有一定的参考价值。

http://codeforces.com/contest/798/problem/D

http://blog.csdn.net/yasola/article/details/70477816

对于二维的贪心我们可以先让它变成其中一维有序,这样只需要重点考虑另一维,就会简单很多。

首先,对于题目要求的选择元素之和两倍大与所有元素之和,我们可以转化为选择元素之和大于剩下的。然后我们可以将下标按照a从大到小排序。然后选择第一个,之后每两个一组,选择b大的一个,如果n是偶数再选择最后一个。

至于这样写的正确性:首先对于数组b,每一组选择的都是大的,而且还有多选的,所以一定比剩下的大。对于数组a,从第一个开始看,当前选择的,一定比下一组剩下的a大。所以这样贪心就一定正确。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 
 8 using namespace std;
 9 const int maxn=1e5+10;
10 struct node
11 {
12     int x;
13     int id;
14 }a[maxn],b[maxn];
15 int n;
16 bool cmp(const node& aa,const node& bb)
17 {
18     return aa.x>bb.x;
19 }
20 int main()
21 {
22     scanf("%d",&n);
23     for(int i=0;i<n;i++)
24     {
25         scanf("%d",&a[i].x);
26         a[i].id=i+1;
27     }
28     for(int i=0;i<n;i++)
29     {
30         scanf("%d",&b[i].x);
31         b[i].id=i+1;
32     }
33     printf("%d\n",n/2+1);
34     sort(a,a+n,cmp);
35     printf("%d",a[0].id);
36     for(int i=1;i<n;i+=2)
37     {
38         if(b[a[i].id-1].x>b[a[i+1].id-1].x)
39         {
40             printf(" %d",a[i].id);
41         }
42         else
43         {
44             printf(" %d",a[i+1].id);
45         }
46     }
47     printf("\n");
48     return 0;
49 }
View Code

 

以上是关于算法系列学习codeforces D. Mike and distribution 二维贪心的主要内容,如果未能解决你的问题,请参考以下文章

CF 547 D. Mike and Fish

[卿学姐带飞系列]-Codeforces Round #410 (Div. 2)_B - Mike and strings

codeforces 86D D. Powerful array(莫队算法)

codeforces #305 D Mike and Fish

CF Round410 D. Mike and distribution

ST表和倍增算法(Array Stabilization (GCD version)Codeforces Round #717 (Div. 2) D. Cut)