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;
}

  

原文地址:https://www.cnblogs.com/mcq1999/p/11966406.html

时间: 2024-11-09 04:04:23

CodeForces - 1253C(思维+贪心)的相关文章

Codeforces 1093C (思维+贪心)

题面 传送门 题目大意: 有一个长n(n为偶数)的序列a 已知a满足 \(a_1≤a_2≤?≤a_n\) 给出一个长度为\(\frac{n}{2}\) 的序列b,定义\(b_i=a_i+a_{n-i+1}\) 求出序列a (输出任意一种答案即可) 分析 为了保证序列不下降,我们采用贪心的思想,先假设\(a_i=a_{i-1}\),这样给后面的数留有的余地更大 然后计算出\(a_{n-i+1}=b_i-a_i\),如果\(a_{n-i+1}>a_{n-i+1+1}\),即不满足不下降的条件,则进行

Codeforces 413C Jeopardy!(贪心)

题目链接:Codeforces 413C Jeopardy! 题目大意:给出n个关卡,每个关卡闯关成功会得到相应的分数,有m个关卡闯关成功之后,可以选择不加上该关卡的分,而是将已有的分数翻倍,现在有一位选手已经有能力闯过所有的关卡,问说他能得到的最大分数是多少. 解题思路:贪心,将可以翻倍的关卡放在后面比,不能翻倍的关卡放在前面比,然后在按照关卡分数大的先比,如果该关卡分数可以翻倍,就判断是当前关卡的分数高还是已有的分数高. #include <cstdio> #include <cst

Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以当作 ( 可 ) . 问这个字符串有多少个子串是正确的括号串. tags:好考思维,想不到.. 预处理出每个字符向左向右最多可以匹配到哪里,再 O(n*n) 枚举所有区间,看是否符合条件. // C #include<bits/stdc++.h> using namespace std; #pra

Balanced Ternary String CodeForces - 1102D (贪心+思维)

You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' or '2'. Such strings are called ternary strings. Your task is to replace minimum number of characters in this string with other characters to obtain

CodeForces - 1251E2 (思维+贪心)

题意 https://vjudge.net/problem/CodeForces-1251E2 一共有 n 个选民,你可以付出 pi? 的代价让第 i 个选民为你投票,或者,在为你投票的人数达到 mi? 时,他会主动为你投票而不用你付出任何代价. 问得到所有选民投票的最小代价. 思路 考虑贪心,对容易跟风的就跟风,对不容易跟风的就贿赂,所以对每个mi用vector插入相应的pi,然后从大到小遍历vector(不易跟风的要花钱),对于每一个mi,把对应的p插入到小根堆,小根堆里的人默认是跟风的,设

Codeforces Round #629 (Div. 3) D. Carousel(思维/贪心?)

The round carousel consists of nn figures of animals. Figures are numbered from 11 to nn in order of the carousel moving. Thus, after the nn -th figure the figure with the number 11 follows. Each figure has its own type — the type of the animal corre

codeforces 1029E Tree with Small Distances【思维+贪心】 【非原创】

题目:戳这里 学习博客:戳这里 题意:给一个树加最少的边,使得1到所有点的距离小于等于2. 解题思路:分析样例3可以看出,如果一个点到1的距离大于2,那么建立1到该点的父亲节点的边将比直接与该点建边更优.官方题解的做法是把所有与1距离大于2的点放到大顶堆里维护,每次取出最远的点,染色与该点父节点以及与父节点相接的所有点.也就是相当于与父节点建边,距离为1,与父节点的子节点的距离就为2了,于是把这些点弹出.从大佬博客中学到一个很妙的写法,是用dfs实现这个思路,具体看代码. 附ac代码: 1 #i

CodeForces - 1251C (思维+贪心+归并排序)

题意 https://vjudge.net/problem/CodeForces-1251C 一个字符串,相邻的偶数奇数不能交换位置,其他相邻的情况可以交换,问字符串代表的数最小是多少. 思路 相邻的偶数.奇数位置固定,所以可以把奇数放到一起,偶数放到一起,对这两堆归并排序即可. 代码 #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=2000

CodeForces - 1251B (思维+贪心)

题意 https://vjudge.net/problem/CodeForces-1251B n个01串,可以任意交换任意两个字符串的字符任意次,问最多能有多少个回文串. 思路 分类讨论可以发现规律: 当串长度l为奇数,插入任意<=l个1都可以: 当串长度l为偶数,插入偶数个1才行. 所以对于每个串,都可以插入偶数个1,当1的个数为奇数时,说明必须有一个奇数串,如果没有那么肯定有一个串不回文(1的个数为奇数的偶数长度的串). 代码 #include<bits/stdc++.h> usin