zoukankan      html  css  js  c++  java
  • Codeforces Round #253 DIV1 C 馋

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

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

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


    #include<iostream>
    #include<cstdio>
    #include<list>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<stack>
    #include<map>
    #include<vector>
    #include<cmath>
    #include<memory.h>
    #include<set>
    
    #define ll long long
    
    #define eps 1e-8
    
    const int inf = 0xfffffff;
    
    const ll INF = 1ll<<61;
    
    using namespace std;
    
    //vector<pair<int,int> > G;
    //typedef pair<int,int > P;
    //vector<pair<int,int> > ::iterator iter;
    //
    //map<ll,int >mp;
    //map<ll,int >::iterator p;
    int n;
    int num[1000000 + 5];
    
    stack<int >	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<n;i++)
    			scanf("%d",&num[i]);
    		return false;
    	}
    	return  true;
    }
    
    void cal() {
    	bool flag = false;
    	s.push(num[0]);
    	for(int i=1;i<n;i++) {
    		if(num[i] <= s.top()) {s.push(num[i]);flag = true;continue;}
    		if(num[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<cnt-2;i++)
    		ans += num[i];
    }
    
    void output() {
    	printf("%I64d
    ",ans);
    }
    
    int main() {
    	while(true) {
    		init();
    		if(input())return 0;
    		cal();
    		output();
    	} 
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    414. Third Maximum Number 第三大的数字
    java 正则表达式
    将含有逻辑运算符的字符串解析为逻辑符号
    ora-01830:日期格式图片在转换整个输入字符串之前结束
    mysql的字符拼接
    oracle执行计划详解
    oracle获取执行计划及优缺点 详解
    kmp算法中的nextval实例解释
    kmp算法中的next数组实例解释
    哈夫曼实例解释(哈夫曼编码)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4916730.html
Copyright © 2011-2022 走看看