1183:病人排队

1183:病人排队

时间限制: 1000 ms 内存限制: 65536 KB
提交数:69841 通过数: 30810
【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

1.老年人(年龄 ≥60
岁)比非老年人优先看病。

2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。

3.非老年人按登记的先后顺序看病。

【输入】
第1行,输入一个小于100
的正整数,表示病人的个数;

后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10
的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。

【输出】
按排好的看病顺序输出病人的ID,每行一个。

【输入样例】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【输出样例】
021033
010158
021075
004003
102012

#include<bits/stdc++.h>
using namespace std;
struct Patient{
    string id;
    int age;
    int order;
};
//老年人与非老年分开处理
bool cmp(const Patient& a,const Patient& b)
{
    if(a.age>=60 && b.age<60)
    {
        return true;
    }
    else if(a.age<60 && b.age>=60)
   {
    return false;
   }
   else if(a.age>=60 && b.age>=60)
   {
    if(a.age!=b.age)
    {
        return a.age>b.age;
    }
    else{ return a.order<b.order;}
   }else
   return a.order<b.order;
}
int main(){
    int n,k;
    cin>>n;
    Patient s[n],temp[2];
    for(int i=0;i<n;i++)
    {
        cin>>s[i].id>>s[i].age;
        s[i].order=i;
    }
    sort(s,s+n,cmp);
    for(int i=0;i<n;i++)
    {
        cout<<s[i].id<<endl;
    }
    return 0;
}

这个采用的是将条件整合在一起,以60为界限分几种可能情况,然后利用sort排序。
`#include<bits/stdc++.h>
using namespace std;

define N 105

struct Peo
{
char id[10];
int age;
};
int main()
{
int n, io = 0, iy = 0;//io:old数组中元素个数 iy:young数组中元素个数
cin >> n;
Peo old[N], young[N], a;//old:老年人信息 young:年轻人信息
for(int i = 1; i <= n; ++i)
{
cin >> a.id >> a.age;
if(a.age >= 60)//加入到老年人数组,做插入排序
{
old[++io] =a;
for(int j = io; j > 1; j--)//插入排序
{
if(old[j].age > old[j-1].age)
swap(old[j], old[j-1]);
else
break;
}
}
else
young[++iy] = a;
}
for(int i = 1; i <= io; ++i)
cout << old[i].id << endl;
for(int i = 1; i <= iy; ++i)
cout << young[i].id << endl;
return 0;
}
这个是采用插入排序法,将目标分为两个群体分别排序。 主要是插入排序,#include<stdio.h>
// 插入排序,升序
void InsertSort(int* a, int n)
{
for (int i = 1; i < n; i++) // 决定所插入数据的位置 和 决定插入遍历的次数
{
int tem = a[i]; // 被插入的数据相当于原来位置并没有变,用一个中间变量“提出来”要比较的值。
int end = i - 1; /*决定 与被插入的数据相比较 的区间,从后往前,因为插入排序的特性。“插入一个有序数列”,可以减少比较次数,时间复杂度一般为on */
while (end >= 0) // 结束条件:全部数据比较完成,该循环目的是:找到比被插入数据要小的值的位置
{
if (a[end] > tem) // 已排好的数组中end的位置上的数 比 所要插入的数 大就交换
{
a[end + 1] = a[end]; // 大数往后移一位,这个比较关键,插入排序还是要在比较后移动,比较成功,大数后移
end--; // end 往前走一步
}
else // 有数据比 被插入的数据要小,跳出循环
{
break;
}
}
a[end + 1] = tem; // 将要插入的数插入到 end 位置的后一位。
}
}

int main()
{
int a[] = { 29,10,14,37,12,6,32 };
int sz = sizeof(a) / sizeof(a[0]); // 获取数组的大小

printf("插入排序:\n");

for (int i = 0; i < n; i++)            // 打印排序前的序列
{
	printf("%d ", a[i]);
}
printf("\n");

InsertSort(a, sz);                     // 执行 插入排序 函数

for (int i = 0; i < n; i++)            // 打印排序后的序列
{
	printf("%d ", a[i]);
}
printf("\n");

}`。

posted @ 2026-03-12 19:34  Szy111  阅读(2)  评论(0)    收藏  举报