请教一个算法问题,魔法师排队

Cristral 2018-11-25 02:32:50
时间限制 2000 ms
内存限制 64 MB
题目描述
有n个魔法师在排队买魔法面包,每个魔法师都有自己的魔力值,用一个正整数表示。 魔法师都不喜欢排队,如果任意时刻某个魔法师发现前面的魔法师的魔力值比自己小,那么这个魔法师就会用法术把前面的人传送到异空间。 请输出有多少个魔法师会被传送到异空间。


输入数据
第一行为一个正整数n,代表魔法师的人数。 接下来一行位n个正整数,第i个正整数ai代表队伍中第i个魔法师的魔力值。(第1个魔法师在队头,第n个魔法师在队尾) 1<=n<=1000000 1<=ai<=100000000

输出数据
被传送到异空间的魔法师个数

样例输入
5
4 5 1 3 2
样例输出
2

写出了程序但由于数据较大,运行超时只得到了90分,程序如下,希望能个得到更好的解答方法!!!!!!
#include<iostream>
#include<stdio.h>
using namespace std;

long long a[1000001];

int main(){
int n,sum = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
for(int j = 0; j <n-1; j++){
for(int i = j+1; i < n; i++){
if(a[j] < a[i]){
sum++;
break;
}
}
}
printf("%d",sum);
return 0;
}
...全文
281 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-11-27
  • 打赏
  • 举报
回复
才100万个,Long类型(4字节数据)就够了吧。
100万个Long值,才约4MB空间呢。
不过就算 Long Long类型,也才不到8MB吧。

按楼上说的,“从尾部向前扫描”,100万个数据,恐怕要不到0.3秒吧。
宸 星 2018-11-26
  • 打赏
  • 举报
回复
就像我刚刚传的那样 如果你想要自己输入 把rand函数改一下就好了
宸 星 2018-11-26
  • 打赏
  • 举报
回复
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;

long long a[1000001];

int main()
{
int n,sum = 0;
srand((unsigned)time(NULL));

scanf("%d",&n);
for(int i = 0; i < n; i++)
{
a[i]=rand()%100000000+1;
}
for(int j=n-1;j>0; j--)
{
for(int i = j-1;i>=0;i--)
{
if(a[j]>a[i]&&i!=0)
{
sum++;
}
else if(i==0)
{
sum++;
j=0;
break;
}
else
{
j=j-(j-i)+1;
break;
}
}
}
for(int i=0;i<n;i++)
{
printf("%d\n",a[i]);
}

printf("%d",sum);
return 0;
}
ckc 2018-11-26
  • 打赏
  • 举报
回复
从队尾扫描一次就可以了 从最后一个开始,向前扫描,如果发现有小的就传送,如果发现有大的,则从这个大的开始继续向前扫描
xiexiejohn 2018-11-26
  • 打赏
  • 举报
回复
这不是找队伍中最大数问题吗(就是一段一段找最大数)
从头到尾找最大数(因为最大数会把它之前数全扫掉),然后再从最大数后一位开始再找最大数,一直重复到这个过程直到结束
永远的追梦人 2018-11-25
  • 打赏
  • 举报
回复
从队尾开始判断,如果前面小于后面则传送走

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧