首页 > 代码库 > 九度OJ 1398 移动次数 (数组,模拟)
九度OJ 1398 移动次数 (数组,模拟)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1375
解决:369
- 题目描述:
众所周知JOBDU旗下的JOBBALA公司是一家以个性、亲民著称的IT公司。在JOBBALA公司成立50周年的日子里,公司CEO组织全体员工登山旅游。按照往常的习惯,导游通常要求游客按照身高从低到高的顺序排好,但是考虑这次JOBBALA人数太多,排序很耗时间。因此,导游想了想,要求JOBBALA的员工可以随便排,但是必须保证队列的第一个是队列中最矮的,队列的最后一个是队列中最高的。例如:队列 { 1, 4, 3, 2, 2, 5} 就是符合的队列,{1, 4, 2, 3, 2, 5}也符合,而{2, 1, 2, 3, 4, 5}就是错的。请问对于任意的队列,最少要两两交换多少次,可以让其符合导游的要求?
- 输入:
输入有多组测试案例,每个测试案例为2行。
第一行包括一个整数n(2<=n<=200)表示人数,接下来一行包括n个整数a1, a2, …… an (1<=ai<=200) 表示n个员工初始的排列。
- 输出:
对应每个测试案例,按照导游的要求,输出最少需要两两交换的次数。
- 样例输入:
289 88455 88 1 2
- 样例输出:
13
- 提示:
- 案例2中,最少需要移动三次:(55 88 1 2) -> (55 1 88 2) -> (1 55 88 2) -> (1 55 2 88)
#include<stdio.h> int n; int t; int ans; int MAX=-1; int MIN=0x3f3f3f3f; int MAX_INDEX; int MIN_INDEX; int main(int argc, char *argv[]) { //freopen("1398.in", "r", stdin); //std::ios::sync_with_stdio(false); //std::cin.tie(0); while(~scanf("%d",&n)){ MAX=-1; MIN=0x3f3f3f3f; ans=0; for(int i=1;i<=n;++i) { scanf("%d",&t); if(t<MIN){ MIN=t; MIN_INDEX=i;//最小的i } if(t>=MAX) { MAX=t; MAX_INDEX=i;//相同最大值的情况下,最大的下标 坑 } } // cout<<"MIN_INDEX is "<<MIN_INDEX // <<"MAX_INDEX is "<<MAX_INDEX // <<"\n"; if(MIN_INDEX<MAX_INDEX){ ans=MIN_INDEX+n-1-MAX_INDEX; } else { ans=MIN_INDEX+n-1-MAX_INDEX-1; } printf("%d\n",ans); } return 0; }
九度OJ 1398 移动次数 (数组,模拟)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。