视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CodeforcesRound#253DIV1C贪心_html/css
2020-11-27 15:54:27 责编:小采
文档


http://codeforces.com/contest/442/problem/C

题意很easy,基本上肯定有坑坑洼洼的样子,看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画画过程稍微推一下就会发现,除了最大的两个数以外都可以得到,然后就是凹的情况了,凹的情况肯定是唯一的,把中间的数除去得到一个值,但是凹凸有结合该怎么办,猜一把先把凹的单独一个个给解决了,产生没有凹的序列再处理,然后刚好对于第一个案例进行测试,发现答案正确,于是就这么贪心的敲了一个

对于凹的情况 可以使用栈来处理,处理完对于没有凹的情况直接排序 除了最大的两个数以外其它 可以都取了


#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long#define eps 1e-8const int inf = 0xfffffff;const ll INF = 1ll<<61;using namespace std;//vector > G;//typedef pair P;//vector > ::iterator iter;////mapmp;//map::iterator p;int n;int num[1000000 + 5];stack	s;ll ans; void init() {	memset(num,0,sizeof(num));	while(!s.empty())s.pop();	ans = 0ll;}bool input() {	while(scanf("%d",&n) == 1) {	for(int i=0;i= s.top() && flag) {	s.pop();	ans += min(num[i],s.top());	if(num[i] <= s.top())flag = true;	else {	while(true) {	int tmp = s.top();	s.pop();	if(s.empty()) {	s.push(tmp);	break;	}	if(tmp > s.top() || num[i] < tmp) {	s.push(tmp);	break;	}	if(num[i] >= tmp)ans += min(s.top(),num[i]);	}	}	if(num[i] <= s.top())flag = true;	else flag = false;	s.push(num[i]);	continue;	}	s.push(num[i]);	}	memset(num,0,sizeof(num));	int cnt = 0;	while(!s.empty()) {	num[cnt++] = s.top();	s.pop();	}	sort(num,num+cnt);	for(int i=0;i 




下载本文
显示全文
专题