CodeForces 867C Ordering Pizza 贪心,思维
Posted 掉血菜鸡煮熟中
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 867C Ordering Pizza 贪心,思维相关的知识,希望对你有一定的参考价值。
题意:一个pizza 可以分成 s 块,有两种类型的 pizza 。有 n 个人,每个人要吃 si 块 pizza,且吃一块类型 1 的 pizza可以得到 ai 的价值,吃一块类型 2 的 pizza得到 bi 的价值。问:在订购 pizza 个数最少的情况下,求 n 个人能得到的最大价值。
tags:一开始想到每个人取最大价值的类型,但没继续想了。。
其实就是先假定每个取最大价值类型,然后看两种类型余下的个数是否可以用一个 pizza代替,再整一下就是了。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; struct P { ll a, b, ab, s; bool friend operator < (P x, P y) { return x.ab<y.ab; } }p[N]; ll n, cnt1, cnt2, s, ans; int main() { scanf("%lld%lld", &n, &s); rep(i,1,n) { scanf("%lld%lld%lld", &p[i].s, &p[i].a, &p[i].b); p[i].ab = p[i].a-p[i].b; } sort(p+1, p+1+n); rep(i,1,n) { if(p[i].a>p[i].b) { ans += p[i].a*p[i].s; cnt1 += p[i].s; } else { ans += p[i].b*p[i].s; cnt2 += p[i].s; } } cnt1%=s, cnt2%=s; if(cnt1+cnt2 <= s) { ll ans1=ans, ans2=ans, num; for(int i=n; cnt2 && i>=1; --i) if(p[i].ab<=0) { num = min(cnt2, p[i].s); ans1 += num*p[i].ab; cnt2 -= num; } for(int i=1; cnt1 && i<=n; ++i) if(p[i].ab>0) { num = min(cnt1, p[i].s); ans2 += num*(-p[i].ab); cnt1 -= num; } ans = max(ans1, ans2); } printf("%lld\n", ans); return 0; }
以上是关于CodeForces 867C Ordering Pizza 贪心,思维的主要内容,如果未能解决你的问题,请参考以下文章