标签:some least 需要 最优 sort for highlight divide const
Description
Input
Output
题解:
贪心
贪心策略(分三步):
1、显然先把大于c的全部出完
2、从大到小只要不超过c,能出就出
3、从小到大能出就出,直到刚好超过c
证明:显然每次出钱需要浪费的尽量少,这样每次出只会使得出的钱刚好等于c或大于c一点点,所以每次是最优的
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; const int N =25; struct Node { int a,b; bool operator < (const Node &x) const { return a<x.a; } }p[N]; int gi() { int x=0,o=1; char ch=getchar(); while(ch!=‘-‘ && (ch<‘0‘ || ch>‘9‘)) ch=getchar(); if(ch==‘-‘) o=-1,ch=getchar(); while(ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return o*x; } int main() { int n=gi(),c=gi(),i,ans=0; for(i=1; i<=n; i++) p[i].a=gi(),p[i].b=gi(); sort(p+1,p+n+1); i=n; while(p[i].a>c) ans+=p[i].b,i--; n=i; while(1) { int now=0; for(i=n; i>=1; i--) { while(p[i].b && now+p[i].a<=c) { now+=p[i].a; p[i].b--; } } for(i=1; i<=n; i++) { while(p[i].b && now<c) { now+=p[i].a; p[i].b--; } } if(now<c) break; ans++; } printf("%d", ans); return 0; }
标签:some least 需要 最优 sort for highlight divide const
原文地址:http://www.cnblogs.com/HLXZZ/p/7509446.html