小明准备考研,要买一些书,虽然每个书店都有他想买的所有图书,但不同书店的不同书籍打的折扣可能各不相同,因此价格也可能各不相同。因为资金所限,小明想知道不同书店价格最便宜的图书各有多少本,以便节约资金。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
对于每组测试,第一行先输入2个整数m,n(1≤m,n≤100),表示想要在m个书店买n本书;第二行输入m个店名(长度都不超过20,并且只包含小写字母),店名之间以一个空格分隔;接下来输入m行数据,表示各个书店的售书信息,每行由小数位数不超过2位的n个实数组成,代表对应的第1至第n本书的价格。
输出格式:
对于每组测试数据,按要求输出m行,分别代表每个书店的店名和能够提供的最廉价图书的数量,店名和数量之间留一空格。当然,比较必须是在相同的图书之间才可以进行,并列的情况也算。
输出要求按最廉价图书的数量cnt从大到小的顺序排列,若cnt相同则按店名的ASCII码升序输出。
输入样例:
3
3 3
xiwangshop kehaishop xinhuashop
11.1 22.2 33.3
11.2 22.2 33.2
10.9 22.3 33.1
5 5
xwsd khsd xhsd xxsw hytss
1 2 3 4 5
1.2 2.1 2.7 4.1 4.8
0.8 1.9 3.1 3.8 5.2
0.9 1.95 2.65 3.8 5.1
0.9 1.95 2.65 3.8 5.1
4 5
xwsd khsd xhsd xxsw
1 2 3 4 5
1.2 2.1 2.7 4.1 4.8
0.8 1.9 3.1 3.8 5.2
0.9 1.95 2.65 3.8 5.1
输出样例:
xinhuashop 2
kehaishop 1
xiwangshop 1
xhsd 3
hytss 2
xxsw 2
khsd 1
xwsd 0
xhsd 3
xxsw 2
khsd 1
xwsd 0
来源:
[1] 黄龙军, 等. 大学生程序设计竞赛入门—C/C++程序设计(微课视频版), 北京:清华大学出版社, 2020.11. ISBN:9787302564744
[2] 黄龙军.程序设计竞赛入门(Python版),北京:清华大学出版社,2021.4. ISBN:9787302571230
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
int s,t;
scanf("%d",&t);
for(s=0; s<t; s++)
{
int m,n;
int i,j;
scanf("%d%d",&m,&n);
char store[100][20];//一定要把数组开大!!!!!
for(i=0; i<m; i++)
scanf("%s",store[i]);
float price[100][100],min[100];//一定要把数组开大!!!!!
for(i=0; i<m; i++)//不开大的话即便测试正确也会直接提交显示错误!!!
for(j=0; j<n; j++)
scanf("%f",&price[i][j]);
int cnt[100];
for(i=0; i<99; i++)//直接把开大后的数组初始化好
cnt[i]=0;
//数据输入和初始化完成
for(j=0; j<n; j++)//一列一列进行比较
{
min[j]=price[0][j];
for(i=0; i<m; i++) //在一列中找出最小
if(price[i][j]<min[j])
min[j]=price[i][j];
}
for(i=0; i<m; i++) //一行一行进行比较,即检索每个书店能提供的最便宜书数量
for(j=0; j<n; j++)
if(fabs(price[i][j]-min[j])< 1e-6)//浮点数比较相等不能用==
cnt[i]++;
for(i=0; i<m; i++)
for(j=0; j<m-1; j++)
if(cnt[j]<cnt[j+1] || (strcmp(store[j],store[j+1]) > 0 && cnt[j]==cnt[j+1]))
{
int tp=cnt[j];
cnt[j]=cnt[j+1];
cnt[j+1]=tp;
char s[20];
strcpy(s,store[j]);
strcpy(store[j],store[j+1]);
strcpy(store[j+1],s);
}
for(i=0; i<m; i++)
{
printf("%s %d",store[i],cnt[i]);
if(i+1<m)
printf("\n");
}
if(s+1<t)
printf("\n");
}
return 0;
}
/*
#include <stdio.h>//此为CSDN上一篇文章,在其中获得一些借鉴和经验
#include <math.h>//链接:https://blog.csdn.net/m0_59352724/article/details/124781092?spm=1001.2014.3001.5502
#include <string.h>
typedef struct {
char name[22];
double price[102];
int cnt; //cnt意思是每家店有多少种最低价格的书
}Shop;
void fun(Shop shop[], int m, int n){
int i, j;
for(i=0; i<n; i++){ //每种书价格在不同店之间比较大小,计算cnt
double min = shop[0].price[i];
int k[m], minCnt=1, r; //先用k数组暂时来记录最低店铺的下标
k[0] = 0; //默认第1家店为最低
for(j=1; j<m; j++){
if(shop[j].price[i] < min){//找到更低的价格
min = shop[j].price[i];
k[0] = j;
minCnt = 1;
}
else if(fabs(shop[j].price[i] - min) < 1e-6)//浮点数比较相等不能用==
k[minCnt++] = j;
}
for(r=0; r<minCnt; r++)
shop[k[r]].cnt++; //k数组里面记录的是最低价格店铺的下标
}
for(i=0; i<m; i++){ //根据cnt大小降序排序整个shop数组(其实不排序也行?)
int max = shop[i].cnt, maxIndex = i;
for(j=i+1; j<m; j++){
if(shop[j].cnt > max){
max = shop[j].cnt;
maxIndex = j;
}
else if(shop[j].cnt == max){//当cnt相等时,根据店铺名称ASCII码升序排序
if(strcmp(shop[j].name,shop[maxIndex].name) < 0){
max = shop[j].cnt;
maxIndex = j;
}
}
}
Shop tmp = shop[i];
shop[i] = shop[maxIndex];
shop[maxIndex] = tmp;
printf("%s %d\n", shop[i].name, shop[i].cnt);
}
}
int main(){
int t;
scanf("%d", &t);
while(t--){ //t组数据
int m, n, i, j;
Shop shop[102]; //最多有100家店
scanf("%d%d", &m, &n);
for(i=0; i<m; i++){
scanf("%s", shop[i].name);
shop[i].cnt = 0; //cnt默认为0
}
for(i=0; i<m; i++){ //第m家店的第n本书价格
for(j=0; j<n; j++)
scanf("%lf", &shop[i].price[j]);
}
fun(shop, m, n); //自定义函数
}
return 0;
}
*/
本来一直毫无头绪,测试正确,提交就答案错误,就想着去CSDN上搜下不用结构体直接干出来的,结果就找到了下面这篇文章,看到他把数组开满,我就也去试了一下,一提交就对了。
我总结出一个经验:开数组时,别想着刚刚好,一定要往大去开,千万别去省这么一点的内存,否则可能结果会出乎意料。
感兴趣可以去看看:
本b.c语言程序设计作业07_电信二班 上官孙的博客-CSDN博客