# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <windows.h>
typedef struct Feature
{
int ftr_id; //特性id
int ftr_pri; //特性优先级
}Feature;
typedef struct UseCase
{
int uc_id; //用例id
int uc_pri; //用例优先级
int cover_ftr[100]; //关联的特性的id
int sum; //关联的数量
}UseCase;
int cmp(const void* p1, const void* p2) //搭配qsort函数
{
int flag;
UseCase *uc1 = (UseCase*)p1;
UseCase *uc2 = (UseCase*)p2;
/*
优先级从大到小排列
*/
//优先级不等
if(uc1->uc_pri > uc2->uc_pri)
flag = -1;
else if(uc1->uc_pri < uc2->uc_pri)
flag = 1;
//优先级相等,比较用例id
else
flag = uc1->uc_id - uc2->uc_id;
return flag;
}
int main()
{
int i,j,N,M,index,cov_sum;
/*
N:特性数量;
M:测试用例数量;
index:关联的特性下标;
cov_sum:用例覆盖的特性数量
*/
scanf("%d %d\n",&N ,&M);
Feature feature[N];
UseCase usecase[M];
if( (0<N&&N<=100) && (0<M&&M<=100) ) //判断N,M合法性
{
//输入特性的优先级
for(i=0;i<N;i++)
{
scanf("%d\n",&feature[i].ftr_pri);
feature[i].ftr_id = i+1;
} //for-N个特性
//输入用例信息
for(i=0;i<M;i++)
{
//初始化
index=0; cov_sum=0;
usecase[i].sum = 0;
usecase[i].uc_pri = 0;
usecase[i].uc_id = i+1; //用例的id
//输入该用例关联的特性id并统计总数
do
{
scanf("%d",&usecase[i].cover_ftr[cov_sum]);
cov_sum ++;
}while (getchar() != '\n');
usecase[i].sum = cov_sum;
cov_sum = 0;
//计算该用例的优先级
for(j=0;j<usecase[i].sum;j++)
{
index = usecase[i].cover_ftr[j] - 1;
usecase[i].uc_pri+= feature[index].ftr_pri;
}
} //for-M个用例
//排序
qsort(usecase,M,sizeof(UseCase),cmp);
//打印结果
for(i=0;i<M;i++)
{
printf("%d\n",usecase[i].uc_id);
}
} //if-判断合法性
else
printf("请重新输入");
return 0;
}