近来几个贪心

1.互斥的数。
有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。

排除后面的数总是更好的,可以选到前一个或后一个,而选前一个就只有可能只能选一个了,所以后面的总是更好的,至于判断有没有被排除,STL的Map 或者写个双hash就可以了,甚至插入处理都可以不用,因为每个数不同,素数随便选个就基本不会冲突了,所以,一阵hash就可以了

2.糖果
小A有N个糖果盒,第i个盒中有a[i]颗糖果。
小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖。

和上面一样,吃后面的不会丢失最优解,因为吃后面的可以更有机会使更多的数满足条件。如果某个大于x直接吃到x。反正吃的糖使等同的,吃后面的也不吃亏,所以,吃后面的总更好。

#include<bits/stdc++.h>

using namespace std;
typedef unsigned long long ULL;
const int maxn = 130000;
ULL a[maxn];

int main()
{
	int n;
	scanf("%d",&n);
	ULL x;cin>>x;
	for(int i = 1;i <= n;i++) cin>>a[i];
	ULL ans = 0;
	for(int i = 1;i <= n;i++){
		if(a[i] > x){
			ans += a[i] - x;
			a[i] = x;
		}	
		if(a[i] + a[i+1] > x){
			ans += a[i]+a[i+1]-x;
			a[i+1] = x-a[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2017-07-11 21:23  rsqppp  阅读(175)  评论(0)    收藏  举报