每日打卡-AcWing 1750.救生员

这篇博客探讨了AcWing1750题目的解题思路,这是一个关于区间覆盖的问题。通过模拟解雇不同员工,计算剩余员工能覆盖的区间大小,找到最大覆盖长度。文章介绍了使用自定义排序的ArrayList来优化解题过程,并给出了完整的Java代码实现。
摘要由CSDN通过智能技术生成

这道题是个区间覆盖类的题目,可以这样入手:依次模拟解雇第i个员工,然后求出该情况下的区间大小,最后求最大值。

AcWing 1750. 救生员 - AcWing

import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main{
	static FastReader sc =new FastReader();
	static PrintWriter out = new PrintWriter(System.out); 
	public static void main(String[] args) throws Exception
	{
		int n=sc.nextInt();
		ArrayList<PIIs> list=new ArrayList<PIIs>();
		for(int i=0;i<n;++i)
		{
			list.add(new PIIs(sc.nextInt(), sc.nextInt()));
		}
		list.sort(new Comparator<PIIs>() {//自定义的PIIs需要重载比较
			public int compare(PIIs a,PIIs b)
			{
				if(a.getFirst()-b.getSecond()!=0) return a.getFirst()-b.getFirst();
				return a.getSecond()-b.getSecond();
			}
		});
		int res=0;
		for(int i=0;i<n;i++)
		{
			int last=-1,sum=0;
			for(int j=0;j<n;j++)
			{
				if(i==j) continue;
				int start=list.get(j+1).getFirst();
				int end=list.get(j+1).getSecond();
				if(start>last)//求区间覆盖长度
				{
					sum+=end-start;
					last=end;
				}
				else if(last<end) {
					sum+=end-last;
					last=end;
				}
			}
			res=Math.max(res, sum);
		}
		System.out.println(res);
	}
}
class PIIs{
	private int first;
	private int second;
	public int getFirst()
	{
		return this.first;
	}
	public int getSecond()
	{
		return this.second;
	}
	public PIIs(int first,int second)
	{
		this.first=first;
		this.second=second;
	}
}
class FastReader
{
	BufferedReader br;
	StringTokenizer st;
	public FastReader()
	{
		br=new BufferedReader(new InputStreamReader(System.in));
	}
 
	String next()
	{
		while(st==null || !st.hasMoreElements())
		{
			try
			{
				st=new StringTokenizer(br.readLine());
			}
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		return st.nextToken();
	}
 
	int nextInt()
	{
		return Integer.parseInt(next());
	}
 
	long nextLong()
	{
		return Long.parseLong(next());
	}
 
	double nextDouble()
	{
		return Double.parseDouble(next());
	}
 
	String nextLine()
	{
		String str="";
		try
		{
			str=br.readLine();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return str;
	}
}

void welcome() { printf("**********欢迎使用管理系统*************\n"); //以不同的角色进行登录系统 printf("1.管理员身份登录\n"); printf("2.普通用户学生登录\n"); printf("3.退出\n"); printf("******************************************\n"); } //管理员的菜单界面 void mangeview() { printf("**********欢迎管理员登录********\n"); printf("-----------------1.注册学生信息------------------\n"); printf("-----------------2.输出学生信息------------------\n"); printf("-----------------3.删除学生信息------------------\n"); printf("-----------------4.修改学生信息------------------\n"); printf("-----------------5.查询学生信息------------------\n"); printf("-----------------6.学生请假和补卡------------------\n"); printf("-----------------7.排序(姓名、学号、打卡次数)--\n"); printf("-----------------8.考勤数据统计------------------\n"); printf("-----------------9.返回------o( ̄ヘ ̄o#)----\n"); //........ printf("********************************\n"); } //普通用户界面 //普通用户界面提示 void comuser(){ printf("************欢迎学生登录************\n"); printf("-----------------1.录入学生信息------------------\n"); printf("-----------------2.输出学生信息------------------\n"); printf("-----------------3.查询学生信息------------------\n"); printf("-----------------4.排序(姓名、学号、打卡次数)--\n"); printf("-----------------5.学生请假和补卡------------------\n"); printf("-----------------6.返回------o( ̄ヘ ̄o#)----\n"); printf("********************************************\n"); } 这个代码怎么描述,运用了什么函数
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值