问题描述:
小明要组织一台晚会,总共准备了n个节目。然后晚会的时间有限,他只能最终选择其中的m个节目。这n个节目是按照小明设想的顺序给定的,顺序不能改变。小明发现,观众你对于晚会的喜欢程度与前几个节目的好看成都有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推,小明给每个节目定义了一个好看值,请你帮助小明选择出m个节目,满足他的要求
输入格式:
输入的第一行包含两个整数n,m,表示节目的数量。第二行包含n个整数,依次为每个节目的好看值。
输出格式:
输出一行包含m个整数,为选出的节目的好看值。
样例输入:
5 3
3 1 2 5 4
样例输出:
3 5 4
评测用例规模与约定:
对于30%的评测用例,1<=n<=20;
对于60%的评测用例,1<=n<=100;
对于所有评测用例,1<=n<=100000,0<=节目的好看值<=100000。
思路:一圈一圈的找每一圈的最大值及下标并设置相应的标记数组,最后在遍历一次找到与标记数组匹配的项顺序输出即可。
代码:
#include<stdio.h>
int main()
{
long int n,m;
scanf("%d%d",&n,&m);
int i,j,k,l;
int a[n],s[n];//a用来存放输入,s用来保存
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
s[i]=a[i];
}
long int max;
int c1[m];
int c2[m];//用于记录下标
int t=0; //用来标记当前统计到第几个节目
int t1=0;
long int temp;
while(t<m)//限制统计次数
{
max=-1;
for(i=0;i<n;i++)
{
if(a[i]>max)
{
max=a[i];//找当前最大值
temp=i;//记录当前最大值下标
}
}
c1[t++]=max;//将最大值存入数组
c2[t1++]=temp;//将最大值下标记入数组
a[temp]=-2;//这个下标对应的值在下一次不会再变成最大值
}
for(i=0;i<n;i++)//本循环是记录从原数组与条件数组匹配的项,即结果
{
for(j=0;j<m;j++)
{
if(i==c2[j])//a的下标和目标下标有匹配
{
printf("%d ",s[i]);
}
}
}
return 0;
}
测试:
总结:认真看题,当时我差点把输出好看值变成输出节目序号了。中间的标记数组其实感觉只统计下标就好了,统计值纯属多余,以后多加改进。如果发现啥不正好的地方,恳请大家指正!