• CSUOJ 1901 赏赐 OR 灾难 单调栈


    Description

    大G南征北战终于打下了大片土地成立了G国,大G在开国大典上传召帮助自己南征北战的三大开国元勋小A,小B,小C进殿,并要赏赐三人大量宝物以显示天恩浩荡。大G在征服其他国家的时候抢夺了n箱宝物,他把这些箱子依次排列在三人面前,每个箱子里的宝物都有一个价值wi,大G令他们一人选取一个箱子作为奖励。可是令大G万万没有想到的是,三人在私底下是存在竞争关系的,由于小B手上兵权强于小C,小C手上兵权强于小A。所以弱者总是担心自己领取的赏赐高于或等于强者会招来杀身之祸。所以他们三人总是会让小B先选取奖励之后,小C会在小B选择的右侧区域选择价值比小B小的奖励,而小A则会在小B选择的左侧区域选择价值比小B和小C都小的奖励。当然小B是个聪明人,他也会考虑到两人的想法选择对大家都有帮助的方案选取。请问是否存在这样一种选择方案让大家都不用担心会招致杀身之祸。如果存在输出“YES”,否则输出“NO”

    Input

    多组数据读入
    每组数据第一行输入一个正整数n表示n箱宝物(n<=100000)接下来一行输入n个正整数w1,w2,w3,...,wn表示n箱宝物的价值。(wi<=10000000)题目保证所有数据n的总和不超过500000

    Output

    如果存要求的选择方案则输出“YES”,否则输出“NO”。

    Sample Input

    6
    1 2 3 6 5 4
    6
    1 2 3 4 5 6
    

    Sample Output

    YES
    NO
    

    Hint

    第一组数据中,小B可以先选择价值为6的箱子,小A可以在其左侧选择价值为2的箱子,小C可以在其右侧选择价值为5的箱子,这样大家都不用担心给自己招来杀身之祸。第二组数据找不到任意一种选择方案,输出NO。


    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<stack>
    using namespace std;
    #define MAXN 100010
    typedef long long ll;
    int m, n;
    int minn[MAXN], w[MAXN];
    stack<int>s;
    int main()
    {
    	int n;
    	while (cin >> n)
    	{
    		while (!s.empty())
    			s.pop();
    		for (int i = 1; i <= n; i++)
    		{
    			scanf("%d", &w[i]);
    			if (i == 1)//记录前i项中最小的数
    				minn[i] = w[i];
    			else
    				minn[i] = min(minn[i - 1], w[i]);
    		}
    		s.push(w[n]);
    		int flag = 0;
    		for (int i = n - 1; i >= 2; i--)
    		{
    			int a = minn[i - 1];
    			int c = 0;
    			while (!s.empty() && s.top() < w[i])
    			{
    				c = s.top();
    				s.pop();
    			}
    			s.push(w[i]);
    			if (c>a)
    			{
    				flag = 1;
    				break;
    			}
    		}
    		if (flag)
    			cout << "YES" << endl;
    		else
    			cout << "NO" << endl;
    	}
    	return 0;
    }
    /**********************************************************************
    	Problem: 1901
    	User: leo6033
    	Language: C++
    	Result: AC
    	Time:240 ms
    	Memory:3196 kb
    **********************************************************************/
    

  • 相关阅读:
    【C#语言规范版本5.0学习】1.5类和对象(一)
    【C#语言规范版本5.0学习】1.5类和对象(二、类的方法)
    【C#语言规范版本5.0学习】1.4语句
    mac 安装docker
    Laravel 操作指令
    php 查看接口运行时间
    MySql 按日期条件查询数据
    Laravel操作上传文件的方法
    统计数据表中某个字段的值大于2条的数据
    循环中合并数组
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9124426.html
Copyright © 2020-2023  润新知