初级光能
给定n个正整数,请在每一个数的右边查找跟这个数最接近的比它大的数,如果没有就输出0。
两行,第一行为n;第二行n个正整数。
一行,n个数,每两个数之间用空格隔开。
6 6 15 5 6 7 10
15 0 6 7 10 0
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000000];
int main(){
int n;
bool flag=false;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for (int i=1;i<=n;i++)
{
flag=false;
for (int j=i;j<=n;j++)
{
if (a[i]<a[j])
{
printf("%d ",a[j]);
flag=true;
break;
}
}
if (flag==false) cout<<0<<" ";
}
return 0;
}
项依凡在2018-08-16 08:02:14追加了内容
这道题是ai课堂的,没有题号
中级光能
这是主要部分:
输入>>n;
循环(int i=1;i<=n;i++)
{
cin>>a[i];
b[n-i+1]=a[i];
}
循环(int i=1;i<=n;i++)
{
循环(int j=n-i;j>=1;j--)
{
如果(a[i]<b[j])
{
输出<<b[j]<<" ";
break;
}
否则 如果(a[i]>b[j])
{
s++;
如果(s==n-i)
{
输出<<0<<" ";
}
}
}
}
输出<<0;
自己多理解理解
别忘了文件头和定义,哈
望采纳!!!!
希望对你有一定的帮助!!!!
资深守护
主要原因应该是样例太强了
发一下题号行不行
这里有一个优化,应该能让你不再爆0(你不发题号,我也试不了能否AC):
首先,用一个变量存之前输出是0的最大数
其次,每次i++开始新一轮后,判断2点(i==1不要进行优化,直接算):
最后,上优化代码
if(a[i]>=t) //t为那个变量
{
cout<<"0 ";
t=a[i];
continue;
}
即为
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000000],t;
int main(){
int n;
bool flag=false;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for (int i=1;i<=n;i++)
{
flag=false;
if(i>1&&a[i]>=t) //t为那个变量
{
cout<<"0 ";
t=a[i];
continue;
}
for (int j=i;j<=n;j++)
{
if (a[i]<a[j])
{
printf("%d ",a[j]);
flag=true;
break;
}
}
if (flag==false) cout<<0<<" ";
}
return 0;
}
徐铭凯在2018-08-10 16:37:28追加了内容
我只算发了个优化,最后一段剩余代码全为发帖者所写,只加了个优化部分,勿举报!!!
资深天翼
单调栈飞快。
for(int i=1; i<=n; i++)
{
int a;
cin>>a;
while(!s.empty()&&s.top().high<a)
{
ans[s.top().num]=i;
s.pop();
if(s.empty()) break;
}
s.push((cow){a,i});
}