[POJ3614]Sunscreen (貪心)
阿新 • • 發佈:2018-12-15
題意
(依然來自洛谷)
有C個奶牛去晒太陽 (1 <=C <= 2500),每個奶牛各自能夠忍受的陽光強度有一個最小值和一個最大值,太大就晒傷了,太小奶牛沒感覺。
而剛開始的陽光的強度非常大,奶牛都承受不住,然後奶牛就得塗抹防晒霜,防晒霜的作用是讓陽光照在身上的陽光強度固定為某個值。
那麼為了不讓奶牛燙傷,又不會沒有效果。
給出了L種防晒霜。每種的數量和固定的陽光強度也給出來了
每個奶牛隻能抹一瓶防晒霜,最後問能夠享受晒太陽的奶牛有幾個。
分析
依然是一道貪心,依然是一道USACO的,依然是一道李煜東書上的,依然我是做不來的
對奶牛可承受的SPF(日光)最小值排序
對沐浴露(防晒霜?)最小值排序
證明過程略(哇,好懶)
Code
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #define ll long long #define N 50005 using namespace std; int n,num; struct COW { int l, r, id,ans; bool operator <(const COW x) const{ return l < x.l; } }cow[N]; int ans[N]; priority_queue<pair<int, int> > s; int main() { //freopen("testdata.in", "r", stdin); scanf("%d", &n); for (int i = 1; i <= n; i++) { cow[i].id = i; scanf("%d%d", &cow[i].l, &cow[i].r); } sort(cow+ 1, cow + 1 + n); for (int i = 1; i <= n; i++) { int total = s.size(); if (total && -s.top().first < cow[i].l) { cow[i].ans = s.top().second; s.pop(); s.push(make_pair(-cow[i].r, cow[i].ans)); continue; } cow[i].ans = ++num; s.push(make_pair(-cow[i].r, num)); } printf("%d\n",s.size()); for (int i = 1; i <= n; i++) ans[cow[i].id] = cow[i].ans; for (int i = 1; i <= n; i++) printf("%d\n", ans[i]); return 0; }