中级启示者
题目描述 Description
现在购买火车票有很多方式,可以网上买,电话买,到购票大厅买。可是在2000年的时候,人们只能去火车站排队买票,为了能买到票,需要在售票窗口排很长很长的队伍。有一天晚上,在车站大厅值班的李站长发现排队中有不少老人,本着尊老爱幼的思想,站长组织共排队人员给老人家让让位置,让排在后面的老人和排在年轻人前面。他让因为当天只有他一个人值班,所以每次给一个老人调换位置。问需要至少调整多少次位置,才能让整个队伍的老年人全部排在前面。(老年人的年龄要不低于60岁)
输入描述 Input Description
两行:
第一行:一个数字n,表示现在排队的人数;(5<=n<=30)
第二行:排队的每个人的年龄,用空格隔开;(年龄范围在20-70之间)
输出描述 Output Description
调整的次数
这个每日一题............
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
using namespace std;
int n,a[100],cnt;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[j]>a[i]){
swap(a[i],a[j]);
cnt++;
}
}
}
cout<<cnt;
return 0;
}
样例都没过
求思路+核心
@周琪岳 @崔竣恺
初级守护
选择排序优化呀,因为一次双重循环里可能会cnt++多次
选择排序优化:
选择排序代码实现(不违反版规,提交WA):
#include<iostream> using namespace std; int a[10000],n,i,j,t; int main() { cin>>n; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n-1;i++) //依次确定a[1]~a[n-1]的值 { int pos=i; //pos用来记录最小值的下标 for(j=i+1;j<=n;j++) { if(a[j]<a[pos]) //如果后面有元素a[j]比已有的最小值a[pos]小 { pos=j; //就把pos更新为下标j } } swap(a[i],a[pos]); //将a[i]与最小值交换位置 } for(i=1;i<=n;i++) cout<<a[i]<<" "; return 0; }
中级启示者
for(i=1;i<=n-1;i++){
int pos=i;
for(j=i+1;j<=n;j++) {
if(a[pos]<a[j]&&a[j]>60) {
pos=j;
cnt++;
}
swap(a[i],a[pos]);
}
}
选排优化,样例是对的,是10分