近来几个贪心
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;
}

浙公网安备 33010602011771号