首页 > 其他分享 >Codeforces 1253 C. Sweets Eating 做题记录(DP)

Codeforces 1253 C. Sweets Eating 做题记录(DP)

时间:2022-12-29 22:55:49浏览次数:44  
标签:Eating int sum Codeforces long 甜度 Sweets maxn 糖果

  很明显,贪心策略是先吃甜度大的可以保证最终的总甜度最小,因此我们先从小到大排个序。一天可以吃$m$个,因此我们对于每个$k$,就让甜度前$1~m$名在第一天吃,前$m+1~2m$名第二天吃……以此类推。我们可以写个相对若智的暴力解法。(理所当然会TLE哒!)

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5;

int n,m;
int a[maxn+5];

long long sum[maxn+5];

int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    long long ans;
    for (int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i],ans=0;
        for (int j=i;j>0;j-=m){
            if (j>=m)
                ans+=(long long)((i-j)/m+1)*(sum[j]-sum[j-m]);
            else
                ans+=(long long)((i-j)/m+1)*(sum[j]);
        }
        printf("%lld ",ans);
    }
    return 0;
} 
View Code

  

  来考虑优化。很明显,因为对于每个$k$,它的甜度前$1~m$名、前$m+1~2m$名划分区间都是大不一样的,随着$k$的右移,前$1~m$名的划分区间也会右移,并不好下手。但是我们可以发现规律:$k$和$k+m$,它的甜度划分区间是类似的,即$k$的甜度前$1~m$名,是$k+m$的前$m+1~2m$。

  也就是说,我们在已知$k$的答案后,再多选择$m$个糖果时,相当于前面的$k$个糖果都推迟一天吃。我们设$d[i]$为吃$i$个糖果的答案,前缀和$sum[i]$为排序后前$i$个糖果的甜度之和,可以写出递推方程:

$$d[i+m]=d[i]+sum[i]+(sum[i+m]-sum[i])$$

  其中,第一个$sum[i]$是前面的$k$个糖果都推迟一天吃所造成的甜度上升,$(sum[i+m]-sum[i])$是多选择的$m$个糖果时(它们显然都在第一天吃)的甜度和。

  化简完就是:

$$d[i+m]=d[i]+sum[i+m]$$

  这样就用DP优化完啦!

  最终代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5;

int n,m;
int a[maxn+5];

long long sum[maxn+5];
long long d[maxn+5];

int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for (int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
        d[i]=(i>=m)?d[i-m]+sum[i]:sum[i];
        printf("%lld ",d[i]);
    }
    return 0;
} 

 

标签:Eating,int,sum,Codeforces,long,甜度,Sweets,maxn,糖果
From: https://www.cnblogs.com/wegret/p/17013743.html

相关文章

  • [Codeforces Round #841]
    [CodeforcesRound#841]CodeforcesRound#841(Div.2)andDividebyZero2022A.JoeyTakesMoneyJoeyTakesMoneProblem:给一个正整数序列\(a_1,a_2,…,a_n(n......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #690 (Div. 3) E1. Close Tuples (easy version) (贪心+思维)
    https://codeforces.com/contest/1462/problem/E1E1.CloseTuples(easyversion)题目大意:给定一个长度为n的序列a,由1到n的整数组成,某些元素可能相等。找出m=3个元......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #766 (Div. 2)C,D
    CodeforcesRound#766(Div.2)C,D今天A竟然看错了,还好后来发现了,A题就写了40几分钟,真有你的过了B,排名是8千多,比前几天好一点,加油ヾ(◍°∇°◍)ノ゙CC相比于D,我更没有......
  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • Error creating bean with name 'demoService': Scope 'request' is not active for t
    测试Spring作用域,@Scope(value=WebApplicationContext.SCOPE_REQUEST),启动报错Causedby:org.springframework.beans.factory.support.ScopeNotActiveException:Error......
  • CodeForces 1163D Mysterious Code
    洛谷传送门CF传送门zxx的题单来的(发一个无脑kmp自动机+dp做法。看到题就很dp,考虑设计状态。显然填字母时要知道当前串与\(s,t\)的匹配位数,否则就不知道\(s,......
  • Codeforces 随机补题记录
    日期序号题号点评12.2029CF1694E很有借鉴意义的化用算法题12.2138CF1713F子集启蒙题12.2954CF1761E有很多细节,要想清楚,下次不要面向数据编程了......
  • Educational Codeforces Round 7
    EducationalCodeforcesRound7https://codeforces.com/contest/622/problems3/6:ABDA.InfiniteSequence水题#include<bits/stdc++.h>usingnamespacestd;i......