CodeForces - 1253C(思维+贪心)
Posted mcq1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 1253C(思维+贪心)相关的知识,希望对你有一定的参考价值。
题意
https://vjudge.net/problem/CodeForces-1253C
n个糖果,一天最多吃m个糖果,每个糖果有个值a[i],第d天会变成d*a[i],问吃k(k=1~n)个糖果权值和的最小值分别是多少。
思路
先排序,再求一遍前缀和。
比如m=2,排序后:2 3 4 4 6 6 7,那么ans[1]=2,ans[2]=5;对于k=3,贪心的想法肯定是把大的两个第一天吃,小的第二天吃,ans[3]=11;对于k,肯定是把最大的m个第一天吃,剩下的可以通过ans[k-m]得到,但是吃最大的m个会多花一天,那么k-m前面的每个糖果都要多吃一遍(因为天数+1),整合一下,就是ans[k]=ans[k-m]+a[k](这里a是前缀和)。
代码
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) ll a[N],ans[N]; int main() { std::ios::sync_with_stdio(false); ll n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n); for(int i=1;i<=n;i++) { a[i]+=a[i-1]; } for(int i=1;i<=m;i++) ans[i]=a[i]; for(int i=m+1;i<=n;i++) { ans[i]=ans[i-m]+a[i]; } for(int i=1;i<=n;i++) { cout<<ans[i]<<" "; } cout<<endl; return 0; }
以上是关于CodeForces - 1253C(思维+贪心)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 1251C (思维+贪心+归并排序)