SDUTOJ 3333--下一较大值(二)(栈的应用)

Problem Description

对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。

Input

 输入有多组,第一行输入t(1<=t<=10),表示输入的组数;

以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。

Output

 输出有多组,每组之间输出一个空行(最后一组之后没有);

每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。

Sample Input

2
4 12 20 15 18
5 20 15 25 30 6 

Sample Output

12-->20
20-->-1
15-->18
18-->-1

20-->25
15-->25
25-->30
30-->-1
6-->-1

由于这个题只给了0.15s的时间以及1e6的数据,只能用栈来实现。

为何用栈呢?由于题意中说明是当前数字-->第一个比当前大的数字,也就是相当要求一个存储结构里,当前某个数字要大于它的尾部数字,然后把尾部数字逐出,否则的话就把这个数字从尾部存入并继续下一步。尾进尾出的结构自然就是栈(双端队列过于麻烦),所以在这里用栈模拟整个过程。

整个模拟过程是:对于每个输入的数字,如果栈是空的,直接把这个数字压入栈中。如果不是空栈,则多次判断当前数字是否比栈顶数字要大,如果成立就把栈顶数字逐一驱逐,并记录栈顶数字所对于的数字为当前数字。当条件不成立是把当前数字压入栈中。当输入结束,还在栈中的数字自然就不存在既在他后边又比它大的数据了,所以一一记录其对应值为-1即可。

由于输出的时候需要依据输入的顺序,所以这里首先需要一个结构体来存储输入时的下标以及这个数字的值,记录栈顶数字的对应值时需要用到下标(否则的话记录无效,我也不知道为什么)。

所以有如下思路:

  1. 构建一个满足需求的结构体
  2. 对于每一次输入,就要比较当前数字和栈顶数字的大小关系并进行操作
  3. 当输入结束(如果你是一次输入操作一次的话),对还在栈中的数字进行处理
  4. 注意题给中的格式要求

代码如下:(请注意修改输入函数scanf_s与输出函数printf_s)

#include<pch.h>
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
#include <map>
#include <algorithm>
#include <stack>
#include <iomanip>
#include <cstring>
#include <cmath>
#define DETERMINATION main
#define lldin(a) scanf_s("%lld", &a)
#define println(a) printf("%lld\n", a)
#define reset(a, b) memset(a, b, sizeof(a))
const int INF = 0x3f3f3f3f;
using namespace std;
const double PI = acos(-1);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int mod = 1000000007;
const int tool_const = 19991126;
const int tool_const2 = 33;
inline ll lldcin()
{
	ll tmp = 0, si = 1;
	char c;
	c = getchar();
	while (c > '9' || c < '0')
	{
		if (c == '-')
			si = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		tmp = tmp * 10 + c - '0';
		c = getchar();
	}
	return si * tmp;
}
///Untersee Boot IXD2(1942)
/**Although there will be many obstructs ahead,
the desire for victory still fills you with determination..**/
/**Last Remote**/
struct tmp
{
	ll first, second, id;//数字值,对应值,下标
}tmps[100100];
stack<tmp>sta;
int DETERMINATION()
{
	ll t;
	cin >> t;
	for (int p = 0; p < t; p++)
	{
		ll n, cnt = 0;
		lldin(n);
		reset(tmps, 0);
		for (int i = 1; i <= n; i++)
		{
			lldin(tmps[i].first);
			tmps[i].id = i;//记录下标
			if (sta.empty())
				sta.push(tmps[i]);//如果是空栈,直接压栈就行
			else
			{
				while (sta.empty()==false&&sta.top().first <tmps[i].first)
				{
					tmps[sta.top().id].second = tmps[i].first;
					sta.pop();
				}//与栈顶数字比较大小,进行操作(必须对栈是否为空进行判断,否则极易栈内越界导致错误)
				if (sta.empty()||sta.top().first >= tmps[i].first)
					sta.push(tmps[i]);
			}
		}
		while (sta.empty() == false)
		{
			tmps[sta.top().id].second = -1;
			sta.pop();
		}//操作留存栈内的数字
		for (int i = 1; i <= n; i++)
		{
			printf_s("%lld-->%lld\n", tmps[i].first, tmps[i].second);
		}
		if (p != t - 1)//注意格式
			printf_s("\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述:输入三个整数,求它们的和、积和平均。 解题思路:首先读入三个整数,然后分别计算它们的和、积和平均,最后输出结果即可。 代码实现: ```python a, b, c = map(int, input().split()) # 读入三个整数 sum = a + b + c # 计算和 product = a * b * c # 计算积 average = sum / 3 # 计算平均 print("sum =", sum) # 输出和 print("product =", product) # 输出积 print("average =", average) # 输出平均 ``` 输出结果: ``` 输入:1 2 3 输出:sum = 6 product = 6 average = 2.0 ``` ### 回答2: 这个问题是关于计算三个整数的和、积和平均的问题。首先,我们需要了解整数的概念,整数是指不包含小数的数,并可以是正数、负数或零。根据问题描述,我们需要计算三个整数的和、积和平均,因此我们需要将这三个整数相加、相乘,并求出它们的平均。 给定三个整数a、b和c, 它们的和为:a + b + c。它们的积为:a × b × c。平均为它们的总和除以三,即:(a + b + c) / 3。我们可以使用基本的算术运算来计算这些。 例如,如果给定三个整数为2,4和6。 它们的和为:2 + 4 + 6 = 12。 它们的积为:2 × 4 × 6 = 48。 它们的平均为:(2 + 4 + 6) / 3 = 4。 使用这种方法,我们可以计算出任意三个整数的和、积和平均。这个问题虽然简单,但是它涉及到了许多基本的算术概念,非常适合初学者练习。同时也展示了计算机科学中很重要的一个概念,即计算机可以处理和计算数字,这使得计算机成为现代科学计算中的重要工具。 ### 回答3: 这个题目要求我们输入三个整数,然后计算它们的和、积和平均。这是一个非常基础的问题,考察了我们对基本运算的掌握能力。我们可以通过编写一个简单的程序,来完成这个任务。 首先,我们需要从用户处获取三个整数。我们可以使用Python语言的input函数实现: ```python a = int(input("请输入第一个整数:")) b = int(input("请输入第个整数:")) c = int(input("请输入第三个整数:")) ``` 接着,我们就可以计算三个整数的和、积和平均了。计算和和积比较简单,使用加法和乘法运算即可。平均需要我们用总和除以元素个数,也便于计算。 ```python sum = a + b + c product = a * b * c average = sum / 3 ``` 最后,我们可以输出结果到屏幕上,告诉用户这三个整数的和、积和平均是多少。 ```python print("这三个整数的和是:", sum) print("这三个整数的积是:", product) print("这三个整数的平均是:", average) ``` 这样,我们就完成了这个题目。通过这个练习,我们巩固了基本的数学运算技能,也熟悉了Python语言的输入输出函数。这项能力在后续的学习和工作中都是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值