题目大意:有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;
else
return 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++;
}
}
else
now++;
}
cout << sum << endl;
}
return 0;
}