当前位置: 代码迷 >> 综合 >> codeforce44B. Valera and Fruits
  详细解决方案

codeforce44B. Valera and Fruits

热度:89   发布时间:2023-12-06 20:19:27.0

题目大意:有n颗果树,每颗果树的有效采摘日期只有两天,并且农夫的每天采摘上限为v,求最大的采摘量

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{int start;int number;int endday;
} fru[10000];
bool cmp(node a, node b)
{if(a.start < b.start)return true;if(a.start > b.start)return false;if(a.start == b.start){if(a.number > b.number)  //不知道为什么这里改成 a.number >= b.number就过不了,第29个测试点3000 1 1 1......就不行了,难道是sort内部的原因么 return true;elsereturn false;}
}
int main()
{int n, m, sum, limit, day, now;while(cin >> n >> m){sum = 0;for(int i = 0; i < n; i++){scanf("%d%d", &fru[i].start, &fru[i].number);fru[i].endday = fru[i].start+1;}sort(fru, fru + n, cmp);int sday = fru[0].start, eday = fru[n-1].endday;day = sday;now = 0;limit = m;while(day <= eday && now < n){if(fru[n-1].endday < day)break;if(day < fru[now].start){day++;limit = m;continue;}if(day > fru[now].endday){now++;continue;}if(day >= fru[now].start && day <=fru[now].endday){if(fru[now].number >limit){sum += limit;fru[now].number -=limit;limit = m;day++;continue;}if(fru[now].number == limit){sum += limit;fru[now].number -=limit;limit = m;now++;day++;continue;}if(fru[now].number < limit){sum += fru[now].number;limit -= fru[now].number;fru[now].number = 0;now++;}}elsenow++;}cout << sum << endl;}return 0;
}