【蓝桥杯】历届真题 答疑(决赛)Java

问题描述
        有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。

        老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。

        一位同学答疑的过程如下:

        1.首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。
        2.然后同学问问题老师解答,编号为 i 的同学需要 ai 毫秒的时间。
        3.答疑完成后,同学很高兴,会在课程群里面发一条消息,需要的时间可以忽略。
        4.最后同学收拾东西离开办公室,需要 ei 毫秒的时间。一般需要 10 秒、20 秒或 30 秒,即 ei 取值为 10000,20000 或 30000。
        一位同学离开办公室后,紧接着下一位同学就可以进入办公室了。

        答疑从 0 时刻开始。老师想合理的安排答疑的顺序,使得同学们在课程群里面发消息的时刻之和最小。

输入格式
输入第一行包含一个整数 n,表示同学的数量。
接下来 n 行,描述每位同学的时间,其中第 i 行包含三个整数 si,ai,ei 意义如上所述。

输出格式
输出一个整数,表示同学们在课程群里面发消息的时刻之和最小是多少。

样例输入
3
10000 10000 10000
20000 50000 20000
30000 20000 30000

样例输出
280000

样例说明
        按照 1 , 3 , 2  的顺序答疑,发消息的时间分别是 20000 , 80000 , 180000 。

评测用例规模与约定
        对于 30% 的评测用例,1 ≤ n ≤ 20 
        对于 60% 的评测用例,1 ≤ n ≤ 200 
        对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ s i ≤ 60000,1 ≤ a i ≤ 1000000 ,

e i ∈{10000 , 20000 , 30000},即ei一定是10000、20000、30000之一。

思路与分析

        这道题目看起来复杂,其实很简单。就是一个很典型的贪心算法的题目。首先我们知道,前面的同学总用时要尽可能少。

        每个同学发送信息的时间其实都是所用时间的(n-i)倍。因此,前面的同学只需要总用时尽可能少就可以了。这个实现起来还是很简单的,录入时间,排序即可。

        那么在总用时排序之后,总用时相同的情况下比较s+a(也就是发出信息的时间)。在s+a再次相同的情况下,最后比较e的用时。

代码

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
	
	public static void main(String[] args) throws IOException {
        int n=0;
        int time[][] = new int[1005][2];
		StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		
		PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
		st.nextToken();
        n=(int)st.nval;
		
		for(int i=1;i<=n;i++) {
            //分别获取s、a、e的时间
			st.nextToken();
            int s=(int)re.nval;

			st.nextToken();
            int a=(int)re.nval;

			st.nextToken();
            int e=(int)re.nval;

			time[i][0]=s+a;    //单个学生答疑结束发送消息所需的时间
			time[i][1]=e;      //收拾东西的时间
		}
		Arrays.sort(time,1,n+1,new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				if((o1[0]+o1[1])==(o2[0]+o2[1])) {
					return o1[0]-o2[0];
				}
				return (o1[0]+o1[1])-(o2[0]+o2[1]);
			}
		});
		int dp[]=new int[1005];
		long result=0;    //答案可能超过int所能表示的范围
		dp[1]=time[1][0];
		for(int i=2;i<=n;i++) {
			dp[i]=dp[i-1]+time[i-1][1]+time[i][0];
		}
		for(int i=1;i<=n;i++) {
			result+=dp[i];
		}
		pr.print(result);
		pr.flush();
	}
}

总结

        此题是较为经典的贪心算法,在熟练掌握的情况下没有什么难度。祝大伙不论在比赛还是在职场上都能顺风顺水,一路开挂。

版权声明:本文为博主作者:瓜是西瓜的瓜原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_50755185/article/details/128801269

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2024年4月10日
下一篇 2024年4月10日

相关推荐