Aizu/Aoj 0033 Ball
2024-08-31 07:10:20
题目大意: 有编号1到10共10个球,从上方丢下去,入口处可以选择进入左边或者右边,最后10个球全部落下去后如果左右两侧都是从小到大的顺序,则输出YES;否则输出NO。
题目原本的标签枚举,复杂度是2^10,,,很容易水过。我这里说的是用贪心的方法,直接扫一遍O(10)复杂度: 设两个栈 模拟左右两个管; 对于每一个球有以下几种处理情况:
1、如果两个栈都为空,就往任意一个栈里放入小球
2、如果当前小球编号同时小于两个栈的栈顶小球编号,则直接输出"NO"
3、如果当前小球编号比其中一个栈的栈顶小球编号小,则放入另一个栈中
4、如果仅有一个栈空或都不为空,就判断当前小球编号是否为其中一个栈的栈顶小球编号数+1,是的话就放入那个栈内
5、当前小球编号都不为两个栈栈顶的小球编号数+1,那就判断哪个栈的栈顶小球编号数距其最近,就放入哪个栈
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <set>
#include <utility>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int a[];
int main()
{
//freopen("input.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
for(int i=; i<; i++)
scanf("%d",&a[i]);
//
stack<int> sl,sr;
sl.push(a[]);
//
bool flag=true;
for(int i=; i<; i++)
{
if(!sr.empty())
{
if(a[i]<sl.top()&&a[i]<sr.top())
{
flag=false;
break;
}
else
{
if(a[i]==sl.top()+)
sl.push(a[i]);
else if(a[i]==sr.top()+)
sr.push(a[i]);
else if(a[i]<sl.top())
sr.push(a[i]);
else if(a[i]<sr.top())
sl.push(a[i]);
else
{
if((a[i]-sl.top())<(a[i]-sr.top()))
sl.push(a[i]);
else
sr.push(a[i]);
}
}
}
else
{
if(a[i]==sl.top()+)
sl.push(a[i]);
else
sr.push(a[i]);
}
}
//
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return ;
}
最新文章
- Entity Framework 6 Recipes 2nd Edition(12-3)译 ->; 数据库连接日志
- 通过form上传文件(php)
- Linux date命令详解
- SQL--存储过程
- 本地仓库 同步到 bitbucket 远程git库
- 深入理解JavaScript系列(转自汤姆大叔)
- 面试问到的Spring
- JavaScript 对象的几种创建方法
- TreeView中节点勾选设置
- 自学Zabbix3.7.2-事件Event-来源与分类
- arm swi 软中断 一例
- struts_01
- SQL外连接
- 4.4管道和中间件介绍「深入浅出ASP.NET Core系列」
- vue 实现图片上传与预览,以及清除图片
- X5中CSS设置
- 我的第一个Java程序和Java简介
- Mina简单的入门示例
- android viewflipper的使用 实现图片滑动效果
- C结构体数组的应用