1. 程式人生 > 其它 >poj 3040(水題)

poj 3040(水題)

#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int v,b;
}nd[25];
int cmp(node nd1,node nd2){
    if(nd1.v>nd2.v)return 1;
    return 0;
}
int main(){
    int i,j,n,c,sum,tmp;
    bool flag;
    scanf("%d%d",&n,&c);
    for(int i=0;i<n;i++){
        scanf(
"%d%d",&nd[i].v,&nd[i].b); } sort(nd,nd+n,cmp); sum = 0; for(i=0;i<n;i++){ if(nd[i].v>=c){ sum += nd[i].b; nd[i].b = 0; } else{ break; } } if(i==n){ printf("%d\n",sum); } else{
while(true){ tmp = 0; for(j=0;j<n;j++){ while(nd[j].b>0&&tmp+nd[j].v<=c){ tmp += nd[j].v; nd[j].b--; } } if(tmp==c){ sum++; tmp = 0; }
else{ for(j=n-1;j>-1;j--){ while(nd[j].b>0&&tmp+nd[j].v<c){ nd[j].b--; tmp += nd[j].v; } if(nd[j].b>0&&tmp+nd[j].v>=c){ nd[j].b--; tmp = 0; sum++; break; } } } if(tmp!=0){ break; } flag = true; for(j=0;j<n;j++){ if(nd[j].b>0){ flag = false; break; } } if(flag)break; } printf("%d\n",sum); } return 0; }