您的位置:首页 > 编程语言 > C语言/C++

poj 3040 这种贪心水题 居然花了我这么久 。。。

2014-03-04 12:28 399 查看
#include<stdio.h>
#include<string.h>
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
#define INF 1000000000
pair<int, int> a[30];
/* int mindate(int q,int w){
if(q<w)
return q;
else
return w;
}*/
int main(){
int n,c;
int use[30];
scanf("%d%d",&n,&c);
int i,j,k;
int ans,mi;
for(i=0;i<n;i++){
scanf("%d%d",&a[i].first,&a[i].second);
}
sort(a,a+n);
ans=0;
for(i=n-1;i>=0;i--){
if(a[i].first>=c){
ans+=a[i].second;
a[i].second=0;
}
}
while(true){
int money=c;
int yes=0;
memset(use,0,sizeof(use));
for(j=n-1;j>=0;j--){
if(a[j].second>0){
int date=min(a[j].second,money/a[j].first);
use[j]=date;
money-=(date*a[j].first);
if(money<=0){
yes=1;
break;
}
}
}
if(money > 0)
{
for(int i = 0; i < n; i++)
if(a[i].second > use[i])
{
while(use[i] < a[i].second)
{
money -= a[i].first;
use[i]++;
if(money <= 0)
{
yes = 1;
break;
}
}
if(money <= 0) break;
}
}
if(!yes) break;
int mi = INF;
for(int i = n - 1; i >= 0; i--)
if(use[i]) mi = min(mi, a[i].second / use[i]);
ans += mi;
for(int i = n - 1; i >= 0; i--)
if(use[i]) a[i].second-= mi * use[i];

}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 基础 贪心