PTA 节约有理

小明准备考研,要买一些书,虽然每个书店都有他想买的所有图书,但不同书店的不同书籍打的折扣可能各不相同,因此价格也可能各不相同。因为资金所限,小明想知道不同书店价格最便宜的图书各有多少本,以便节约资金。

输入格式:

首先输入一个正整数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博客

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮央乜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值