HDU 1031 Design T-Shirt

17 篇文章 0 订阅

HDU 1031 Design T-Shirt

2015年2月26日13:50:28

思路:(1)、设计元素结构体类型

    (2)、初始化结构体,并赋值(这里是把每个人的评分都加起来放在一个元素里面,而不是分开保存每个人的评分)

     (3)、对结构体按照要求排序

     (4)、输出结构体中的index


/*

sort函数的用法
做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
对向量v排序也差不多,sort(v.begin(),v.end());
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp

*/


# include <stdio.h>

typedef struct
{
double data;
int index;
}shirt;

void sortSum(shirt * a, int len)
{
int flag = 0;
shirt temp;
for(int i = 0; i < len-1; i++)
{
for(int j = 0; j < len-1; j++)
{
if(a[j].data < a[j+1].data)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = 1;
}
}
if(flag == 0) break;
}
}

void sortIndex(shirt * a, int len)
{
int flag = 0;
shirt temp;
for(int i = 0; i < len-1; i++)
{
for(int j = 0; j < len-1; j++)
{
if(a[j].index < a[j+1].index)
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = 1;
}
}
if(flag == 0) break;
}
}

int main(void)
{
shirt s[1000];
int n,m,k;
double temp = 0.0;
while(scanf("%d %d %d",&n, &m, &k)!=EOF)
{
getchar(); //吸收回车符。
int i;
for(i = 1; i < 1000; i++)
{
s[i].data = 0;
}//初始化设计元素
while(n--)
{
for(int j = 0; j < m; j++)
{
printf("请输入您的评分:");
scanf("%lf", &temp); //程序运行不运行的原因之一,temp前面没有加&
s[j].data = s[j].data + temp;
s[j].index = j;
}
}
sortSum(s,m); //因为是C,没有C++的sort函数,自己写的一个
sortIndex(s,k);
for(i = 0; i < k; i++)
{
printf("%d", s[i].index+1);
if(i < k-1)
printf(" ");

}
printf("\n");
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值