Codeforces Round #618 (Div. 1)C(贪心)

把所有数看作N块,后面的块比前面的块小的话就合并,这个过程可能会有很多次,因为后面合并后会把前面的块均摊地更小,可能会影响更前面地块,像是多米诺骨牌效应,从后向前推

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 double a[1000007];
 5 vector<double>vv[1000007];
 6 int main(){
 7     //ios::sync_with_stdio(false);
 8     //cin.tie(NULL);
 9     //cout.tie(NULL);
10     int n;
11     scanf("%d",&n);
12     int mx=n;
13     for(int i=1;i<=n;++i){//初始把n个数字分为n块
14         scanf("%lf",&a[i]);
15         vv[i].emplace_back(a[i]);
16     }
17     while(1){
18         int flag=0,temp=0;
19         for(int i=1;i<=mx;++i){
20             double sum=0;
21             for(int j=0;j<vv[i].size();++j)
22                 sum+=vv[i][j];//记录第i块的和
23             for(int j=0;j<vv[i].size();++j){
24                 ++temp;
25                 a[temp]=sum/vv[i].size();//将第i块均分
26                 if((1e-10)+a[temp]<a[temp-1])//这一块的均值小于前一块,则可以继续从后向前合并
27                     flag=1;
28             }
29             vv[i].clear();
30         }
31         if(flag==0)//数组a已经是非降序列
32             break;
33         int tot=0;
34         vv[++tot].emplace_back(a[1]);
35         for(int i=2;i<=n;++i){
36             if((1e-10)+vv[tot].back()<a[i])//后面比前面小的话就合并到前面的块里,否则不合并
37                 ++tot;
38             vv[tot].emplace_back(a[i]);
39         }
40         mx=tot;//合并后剩余的块数,同一块里a数组的值都相同
41     }
42     for(int i=1;i<=n;++i)
43         printf("%.15f\n",a[i]);
44     return 0;
45 }

原文地址:https://www.cnblogs.com/ldudxy/p/12292789.html

时间: 2024-08-01 21:54:37

Codeforces Round #618 (Div. 1)C(贪心)的相关文章

Codeforces Round #401 (Div. 2) E 贪心,线段树

Codeforces Round #401 (Div. 2) A 循环节 B 暴力排一下 C 标记出来,但10^5,特耿直地码了个O(n^2)的上去,最气的是在最后3分钟的时候被叉== D 从后往前贪心暴糙一下就好.比赛时一眼瞄出来了不敢写,搞不懂这样竟然不会超时.. E. Hanoi Factory 题意:n个环体,内径a[i],外径b[i],高h[i].当 a[i+1]<b[i]<=b[i+1] 时,第 i 个环体可以堆在第 i+1个环体上.求可以堆出的最高高度. tags:佩服那些大佬,

Codeforces Round #480 (Div. 2) C 贪心 D 数字、思维 E 树上倍增

Codeforces Round #480 (Div. 2) C. Posterized 题意: 给出 n 个数,都是区间 [0,255] 内的数,要你把 [0,255] 划分成多个长度 <=k 的不重叠的子区间.每个数必须包含在一个子区间内,且这个数的价值是这个子区间的左端点.要你输出这 n 数的价值,且这 n 个价值字典序要最小. tags: 首先很明显字典序最小,那对于第 i 个数 p[i] 定它的区间时,左端点肯定要尽可能小.所以我们直接枚举区间 [ p[i]-k+1, p[i] ] 定

Codeforces Round #546 (Div. 2) D 贪心 + 思维

https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则,假如u在v相邻前面,那么u和v可以交换位置,问你是队列最后一个人的时候你最前可以换到前面哪里 题解 因为相邻才能换,所以最后一个换到前面一定是一步一步向前走,所以不存在还要向后走的情况 设最后一个为u,假设前面有一个能和u换位置的集合,那么需要将这些点尽量往后移动去接u 假设前面有一个不能和u换位置的集合S,

Codeforces Round #547 (Div. 3) F 贪心 + 离散化

https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 代码 #include<bits/stdc++.h> #define M 5000005 #define ll long long #define pb push_back using namespace std; struct N{int l,r;N(int l=0,int r=0):l(l)

Codeforces Round #618 (Div. 2) E

Problem Codeforces 题目地址 Solution 看完qsc大佬的题解后才发现真的是考场降智啊!!!是真的蠢啊!!! 假设前 \(k-1\) 个数已经通过调整达到了最小字典序,调整成了 \(m\) 块,第 \(i\) 的数(因为都是一样的就叫一块)是 \(x_i\).很显然满足一个条件:\(x_1 < x_2 < ... < x_m\). 现在加入第 \(k\) 个数. 第 \(k\) 个数的左边是 \(x_m\) 这一块,我们只要比较一下 \(a_k\) 和 \(x_m

Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当然最后只是输出cost,就没必要建树什么的了.只要理解了huffman算法构造最优二叉树的思路,就按那么想就知道每个a[i]要加多少次了. 当然这道题没想到这些也可以找出规律的,就是一种贪心思想. #include<iostream> #include<cstdio> #include

Codeforces Round #228 (Div. 1) C 贪心

嘎嘎,今天被一些事耽误了,但是还是A了几个题目,这道题还不错 题目链接: 题意:两个人玩游戏,有N堆纸牌,纸牌上有数字,A每次只能取N堆中的 其中一个的顶部的 纸牌,B只能取N堆中的其中一个底部 的纸牌,A,B都想让自己取的和最大,问最后比分为多少 画了一下,如果某一堆里的 纸牌数量为偶数,发现其实是两个人各分一半,因为如果对方想从这里拿走本来属于自己那半部分的 较大的牌,自己完全来得及阻止的, 接下来就是奇数了,奇数 其实先手者就抢到了中间的一张牌,另外两半还是各自一半,所以 应该以每个奇数堆

Codeforces Round #257 (Div. 2)C 贪心

C. Jzzhu and Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Jzzhu has a big rectangular chocolate bar that consists of n?×?m unit squares. He wants to cut this bar exactly k time

Codeforces Round #618 (Div. 2) C.Anu Has a Function

f(x,y)=(x|y)−y按二进制拆位发现对于第i位 若x.y第i位均为1,函数结果第i位为0 若x第i位为0,y第i位为1,函数结果第i位为0 若x第i位为1,y第i位为0,函数结果第i位为1 而对于f(f(…f(f(a1,a2),a3),…an−1),an)无论顺序怎么排 只要第i位为1的个数≥2 n次函数运算后结果第i位为0 证明: 1.若a1第i位为0 那么无论怎么排 n次函数运算后结果第i位为0 2.若a1第i位为1 遇到第二个第i位为1的数后 函数结果第i位为0 之后就变成了第一种