#P11022. 生成测评输入数据

生成测评输入数据

题目背景

回顾之前解决过的问题:P02020. 马拉松耗时

题目描述

某位选手参加总路程为 ss 米的马拉松比赛,如果路途中该选手一直保持 v m/sv\ \verb|m/s| 的匀速速度,那么他需要多长时间完赛?

输入格式

11 行。两个用一个空格隔开的正整数 s,vs,v

输出格式

11 行,该选手完赛耗时。输出按照 aa day(s)\verb|day(s)| bb hour(s)\verb|hour(s)| cc minute(s)\verb|minute(s)| dd second(s)\verb|second(s)|的格式输出,如果 a,b,c,da,b,c,d 中有值为 00 的情况,则不输出对应项;如果不为 11 ,需要输出单位的复数形式。特别地,对于 dd,如果是小数,需要向上取值。注意分析输入输出样例,理解本题的输出格式要求。

输入输出样例

90061 1
1day 1hour 1minute 1second
885605 5
2days 1hour 12minutes 1second
29142 8
1hour 43seconds
345600 2
2days

说明/提示

👀️ 对于100%100\%的数据,1s,v1091 \leq s,v \leq 10^9

解决该问题的 C++ 程序参考代码如下:

#include<iostream>
using namespace std;
int main()
{
    int s,v,second,minute,hour,day;
    cin>>s>>v;
    second = s/v;
    if(s%v>0) second++;
  
    day = second/(24*60*60);  
    if(day>0){
    	cout<<day<<"day";
    	if(day>1) cout<<"s";
    	cout<<" ";
	}
  
    second = second%(24*60*60);
    hour = second/(60*60);  
    if(hour>0){
    	cout<<hour<<"hour";
    	if(hour>1) cout<<"s";
    	cout<<" ";
	}
  
    second = second%(60*60);
    minute = second/60;  
    if(minute>0){
    	cout<<minute<<"minute";
    	if(minute>1) cout<<"s";
    	cout<<" ";
	}

	second = second%60;
	if(second>0){
    	cout<<second<<"second";
    	if(second>1) cout<<"s";
	}
  
    return 0;
}

题目描述

现在需要你编写一个程序,为上面的问题生成多组用于测评的输入数据,要求用输入数据进行测评时,输出结果中 天、小时、分钟和秒 每项的数值只能是 0/1/20/1/2 中的一种(按照上面问题的题意,如果某项值为 00 时不输出该项。需要特别注意的是,这些项不能都为 00)。

为了保证测评的全面性,要求生成的输入数据在满足上述要求的前提下,进行测评时输出数据要覆盖 天、小时、分钟和秒 每项可能取值(0/1/20/1/2)的所有组合情况(需要特别注意的是,这些项不能都为 00)。为此你需要设计足够组数的输入数据,但组数也不是越多越好。

输入格式

本题没有输入。

输出格式

若干行。每行是一组原题测评用的输入数据,包括用一个空格隔开两个正整数 s,vs,v,分别是上面问题中描述的路程和速度。s,vs,v 满足 1s,v1091 \leq s,v \leq 10^9

🎉️🎉️🎉️ 如果你设计的测评输入数据组数是恰好能覆盖所有测试点的最小组数,并且满足 s%v==0s\%v==0 的组数和满足 s%v !=0s\%v\ !=0 的组数正好各占一半,那么你能额外得到 50%50\% 的分数🎉️🎉️🎉️ 。

说明/提示

👀️ 本题采用了特殊的测评机制,每行中的 s,vs,v 的值只要满足本题条件和原题含义即可(在满足这个前提的情况下可以随意设置 s,vs,v 的值)。也不用考虑输出的多行数据的先后顺序,测评时会自动处理。