题解

· · 题解

B3827题解

题目

发现 dalao 都是用结构体和 sort 写的,

那我发一篇不用结构体和 sort 的题解,

话不多说,进入正题。

主要思路

在入门时,老师教了一种叫“打擂台”的方法来比较大小,就是一个叫 mx变量来存最大值,初值为 0,然后挨个比较,只要它比 mx 大,把它的值赋给 mx,变成新的擂主。最后,mx 就是最大值

这道题的思路与“打擂台”基本相同,干脆想成帮派竞争当家的。就是要有两个 mx 和两个存储序号的,mx_1是大当家存储第一大的平均数mx_2 二当家是存储第二大的平均数,挑战者先与 mx_1 比较,比不过再与 mx_2 比较。

既然思路搞明白了,那就上代码!

#include<cstdio>//scanf和printf的头文件
int n,k,x1,x2,a;//x1和x2存题的序号
double mx1,mx2,p;//mx1,mx2用来比较题目的必要性,p用来求平均值
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        p=0.0;//多测不清空,爆零两行泪 qaq
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&a);
            p+=a;//求和
        }
        p/=k;//求平均值
        //重点来了!!!
        if(mx1<p)//如果这道的平均值比 大当家(原来的最大值)大
            mx1=p,x1=i;//成为大当家!
        else if(mx2<p)//打不过大当家,去挑战二当家
            mx2=p,x2=i;//挑战成功!
    }
    printf("%d\n%d",x1,x2);//输出
    return 0;//华丽的地结束
}
输入样例:
3 2
10 20
15 25
20 30

输出:
3
0

喜提 0 分。

why?

我辛辛苦苦调了 3 分钟,发现如果挑战大当家成功的话,原来的大当家理当成为二当家,我们却直接把他踢出了竞争,成为了小弟。

既然知道怎么错的了,那就上 AC 代码。

#include<cstdio>//scanf和printf的头文件
int n,k,x1,x2,a;//x1和x2存题的序号
double mx1,mx2,p;//mx1,mx2用来比较题目的必要性,p用来求平均值
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        p=0.0;//多测不清空,爆零两行泪 qaq
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&a);
            p+=a;//求和
        }
        p/=k;//求平均值
        //重点来了!!!
        if(mx1<p)//如果这道的平均值比 大当家(原来的最大值)厉害(大)
        {
            mx2=mx1,x2=x1;//大当家惜败,成为二当家
            mx1=p,x1=i;//成为大当家!
        }
        else if(mx2<p)//打不过大当家,去挑战二当家
            mx2=p,x2=i;//挑战成功!
    }
    printf("%d\n%d",x1,x2);//输出
    return 0;//华丽的地结束
}
 样例输入 # 1:
 3 2
 10 20
 15 25
 20 30

 输出:
 3
 2

 样例输入 # 2:
 3 2
 10 20
 5 25
 1 2

 输出:
 1
 2  

喜提 AC。