题目大意:有n个装满水的湖,m天。每天可能下雨也可能晴天,只要下雨就会把湖填满,若已满,则发洪水。有一台只能在晴天使用的抽水机,每次抽水只能抽一个湖,并且全部抽光。问是否存在一种使得不发洪水的抽水方案。
题目分析:贪心。贪心策略:对于每个下雨天 i ,让在这天之前的并且在第a[i]个湖上一次水满之后的一个晴天抽走第a[i]个湖中水。
代码如下:
# include<iostream> # include<cstdio> # include<set> # include<cstring> # include<algorithm> using namespace std; set<int>day; int ans[1000005],lst[1000005],n,m; void solve() { memset(lst,0,sizeof(lst)); memset(ans,0,sizeof(ans)); int a,flag=1; day.clear(); for(int i=0;i<m;++i){ scanf("%d",&a); if(!flag) continue; if(!a) day.insert(i); else{ ans[i]=-1; set<int>::iterator it=day.lower_bound(lst[a]); if(it==day.end()) flag=0; else{ ans[*it]=a; lst[a]=i; day.erase(it); } } } if(!flag) printf("NO\n"); else{ printf("YES\n"); for(int i=0;i<m;++i) if(ans[i]>=0) printf("%d ",ans[i]); printf("\n"); } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); solve(); } return 0; }
UVA-1623 Enter The Dragon (贪心)
原文:http://www.cnblogs.com/20143605--pcx/p/4885530.html