P1252 马拉松接力赛题解

今天萝卜又来刷题啦QwQ

老规矩,先看题目描述。

 这是很明显的一道贪心题(只要不是瞎子都能看出来) ,那我们讲讲思路。

首先,每个人有快有慢,我们一定要让跑的快那个人累成细狗再换下一个人。

那问题来了,怎么找到跑的快的那个人然后霍霍他呢?我们不如跳出去,可以先考虑目前能跑的人里选择跑下一个1km的人就行了。于是就有以下函数:

int Min(int a, int b, int c, int d, int e) {
    return min(a,min(b,min(c,min(d,e))));
}

他能找到目前还没累成细狗的人里跑的最快的那个人的速度。我们再新建一个函数,用来判断这个人是谁:

int fast_time(int a, int b, int c, int d, int e) {
    int maxx=Min(a,b,c,d,e);
    if (maxx==a)
        return 1;
    else if (maxx==b)
        return 2;
    else if (maxx==c)
        return 3;
    else if (maxx==d)
        return 4;
    else
        return 5;
}

函数有了,怎么判断下一个人里跑1km的速度呢?我们可以定义dif[10][15]用于记录这个人跑的速度,并在输入时进行计算,这样每个人的速度就有了。我们还需要定义ans[10]用于记录这个人跑到第几km了,方便我们进行编写代码,于是我们的输入就成了这样:

for (int i=1;i<=5;i++) {
    ans[i]=1;
    for (int j=1;j<=10;j++) {
        cin>>t[i][j];
        if(j>1)
            dif[i][j]=t[i][j]-t[i][j-1];
        else
            dif[i][j]=t[i][j];
    }
}

然后就是计算每一km到谁跑了,于是我们可以利用函数找到谁在这里面最快,并更新我们的答案,用last_t记录总耗时,用now记录函数的返回值,也就是跑的那个人:

for (int i=1;i<=25;i++) {
    now=fast_time(dif[1][ans[1]],dif[2][ans[2]],dif[3][ans[3]],dif[4][ans[4]],dif[5][ans[5]]);
    last_t+=dif[now][ans[now]];
    ans[now]++;;
}

最后最最最最最最重要的就是输出,注意!ans[n]记录的只是这个人该跑第几圈,并不是实际跑的km数,所以输出时,我们要将ans[n]减去1:

cout<<last_t<<endl;
for (int i=1;i<=5;i++)
    cout<<ans[i]-1<<" ";

最终总代码:

#include <bits/stdc++.h>
using namespace std;
int t[10][15],dif[10][15],ans[10],last_t,now;
int Min(int a, int b, int c, int d, int e) {
    return min(a,min(b,min(c,min(d,e))));
}
int fast_time(int a, int b, int c, int d, int e) {
    int maxx=Min(a,b,c,d,e);
    if (maxx==a)
        return 1;
    else if (maxx==b)
        return 2;
    else if (maxx==c)
        return 3;
    else if (maxx==d)
        return 4;
    else
        return 5;
}
int main()
{
	for (int i=1;i<=5;i++) {
        ans[i]=1;
        for (int j=1;j<=10;j++) {
            cin>>t[i][j];
            if(j>1)
                dif[i][j]=t[i][j]-t[i][j-1];
            else
                dif[i][j]=t[i][j];
        }
	}
    for (int i=1;i<=25;i++) {
        now=fast_time(dif[1][ans[1]],dif[2][ans[2]],dif[3][ans[3]],dif[4][ans[4]],dif[5][ans[5]]);
        last_t+=dif[now][ans[now]];
        ans[now]++;;
    }
    cout<<last_t<<endl;
    for (int i=1;i<=5;i++)
        cout<<ans[i]-1<<" ";
	return 0;
}

最终效果参考:

如果喜欢的话,记得点赞评论加关注哦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值