今天萝卜又来刷题啦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;
}
最终效果参考:
如果喜欢的话,记得点赞评论加关注哦。