贪心:不是从整体上考虑最优解,而是从局部考虑,类似dp贪心的决策是需要有无后效性的,且局部最优解可以推到整体最优
3
1 2 2
2 3 2
1 0 7
2
分析: 本题的意思是选择几个事件(可不连续),使得某一个国家胜利,但是具体是哪一个国家胜利呢 ,一共是三种可能,可以分别枚举,其思路和蓝桥杯接龙游戏是一样(对每个时间都有选或不选)但会超时CSDNhttps://mp.csdn.net/mp_blog/creation/editor/145415354
贪心的做法也是一样的,如果一起求就没有明确的目标,会很混乱,所以分成三个小任务分别完成,最后再取事件的最大值。贪心思路:(假设a赢)s=sum_a[i]-sum_b[i]-sum_c[i]>0, 只要对s进行排序,依次加起来加到某个数使s为负数(因为事件的发生可不连续)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int f(vector<int>&a,vector<int>&b,vector<int>&c)
{int count=0,sum=0;vector<int> s(n);for(int i=0;i<n;i++){s[i]=a[i]-b[i]-c[i];}sort(s.begin(),s.end(),greater<int>());//vector从大到小排序 for(int i=0;i<n;i++){if(sum+s[i]>0){sum+=s[i];count++;}else break;//接着循环没有意义 }return count;
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;vector<int> a(n);vector<int> b(n);vector<int> c(n); for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){cin>>b[i];}for(int i=0;i<n;i++){cin>>c[i];}int ans=0;ans=f(a,b,c);ans=max(ans,f(b,a,c));ans=max(ans,f(c,b,a));//比较三个数大小 cout<<ans<<endl;return 0;
}