码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 1623 Enther the Dragon 神龙喝水

时间:2015-08-11 06:54:36      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

贪心,每次遇到一个满水的湖要下暴雨的时候,就往前找之前最后一次满水之后的第一个没有下雨的且没有被用掉天day1。

因为如果不选这day1,那么之后的湖不一定能选上这一天。如果这一天后面还有没有下雨的天day2的话,选后面的,会使得day1到day2之前满水的湖选择减少。

#include<bits/stdc++.h>
#define PB push_back
#define MP make_pair
#define fi first
#define second
#define FOR(i,s,e) for(int i = s; i < e; i++)
using namespace std;

const int maxn = 1e6+5;

int lastTime[maxn];

int drink[maxn];
set<int> unUsedNoRainDays;
vector<int> NoRainDays;

int main()
{
    //freopen("in.txt","r",stdin);
    set<int> &s = unUsedNoRainDays;
    vector<int> &v = NoRainDays;
    int *d = drink;
    int *lT = lastTime;
    int T; scanf("%d",&T);
    for(int k = 1; k <= T; k++){
        int n,m; scanf("%d%d",&n,&m);
        memset(lastTime+1,0,sizeof(int)*n);

        s.clear(); v.clear();
        bool fail = false;
        for(int i = 1; i <= m; i++) {
            int t;
            scanf("%d",&t);
            if(t){
                set<int>::iterator it = s.lower_bound(lT[t]);
                if(it != s.end()){
                    d[*it] = t;
                    lT[t] = i;
                    s.erase(it);
                }else {
                    for(; i < m; i++) scanf("%d",&t);
                    fail = true;
                }
            }else {
                v.PB(i);
                d[i] = 0;
                s.insert(i);
            }
        }
        if(fail){
            puts("NO");
        }else {
            printf("YES"); printf("\n%d",d[v[0]]);
            for(int i = 1; i < v.size(); i++){
                printf(" %d",d[v[i]]);
            }
            putchar(\n);
        }
    }
    return 0;
}

 

UVA 1623 Enther the Dragon 神龙喝水

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4719710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!