代码:
#include <stdio.h>
struct basket{
int a;
int b;
int tag; //标记是否输出过
};
int main(){
int t,n,m,max=0,flag; //flag保证每次循环时候,都从每轮未输出过的位置比较大小
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d %d",&n,&m);
struct basket f[n];
for(int j=0;j<n;j++) {
scanf("%d %d", &f[j].a, &f[j].b);
f[j].tag=1; //初始化时,都标记未输出
}
for(int j=0;j<m;j++){
max=0;
flag=0;
for(int k=0;k<n;k++){
if(f[k].tag){
if(f[k].a>f[max].a){
max=k;
}
else if(f[k].a==f[max].a&&f[k].b>f[max].b){
max=k;
}
flag=1; //
}
else if(!f[k].tag&&!flag){ //!flag表示循环过程中,还未遇到没有输出过元素
max++;
}
}
if(j==0)
printf("%d",max+1);
else
printf(" %d",max+1);
f[max].tag=0; //表示当前已被输出
}
printf("\n");
}
return 0;
}
以上flag的作用,带入如下数据进行理解:
1
4 3
12 4
89 0
2 999
0 9999
优化:
上述代码使用tag标记,同时flag标记,无疑增大了程序设计难度。
具体:在每次输出数据的时候,不妨将输出过的元素清0;
优化后代码如下:
#include <stdio.h>
struct basket{
int a; //不使用tag
int b;
};
int main(){
int t,n,m,max=0; //不使用flag
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d %d",&n,&m);
struct basket f[n];
for(int j=0;j<n;j++) {
scanf("%d %d", &f[j].a, &f[j].b);
}
for(int j=0;j<m;j++){
max=0;
for(int k=0;k<n;k++){ //优化处1:判断条件合并
if(f[k].a>f[max].a||(f[k].a==f[max].a&&f[k].b>f[max].b)) {
max = k;
}
}
if(j==0)
printf("%d",max+1);
else
printf(" %d",max+1);
f[max].a=0; //优化处2
f[max].b=0;
}
printf("\n");
}
return 0;
}
如果需要进一步优化,不使用结构体,而采取使用二维数组。