简单贪心算法应用 洛谷 P1056 排座椅

题目链接:https://www.luogu.org/problemnew/show/P1056

大概思路:这道题考的应该是贪心,输入两个要讲话同学的坐标,(x1,y1)(x2,y2),因为他们要讲话所以要么同一行,要么同一列,所以如果同一行的话,就在他们的列上划通道,同列同理。根据贪心算法,只考虑眼前的利益,所以尝试在所有讲话的两个人中间划通道,将应该划通道的位置放到数组里。但通道数量是有限的,所以将数组排序,取K、L条通道,尽量让讲话的同学最少。换句话,也就是说,要尽量把通道划在讲话的同学多的中间。
步骤:

1.相应的输入输出,同时建立数组x、y下标表示在贪心法中应该在行、列上面划通道,x、y的值表示在通道上讲话同学的数量 数组xx、yy表示在x、y值中里的前K、L的值
2.输入的两个同学的坐标,在他们的中间位置设立通道。将x、y中下标为讲话同学的值加一
3.将x、y中前K、L大的值放到xx、yy中
4.对xx、yy排序
5.输出
总结:
题目思路倒是不难,不过写代码的过程有点艰辛,中间的坑有点多。
1.注意输出,输出的最后的一个数字后面是没有空格的,注意哈。
2.升序输出。
3.分享一个容易错的大坑:如何在一个数组中如何求值前k大的值(不能排序动下标)。如在int[] arr={1,7,6,8,5,9,32}中求第一大的值、第二大的值、第三大的值。
(1)在外面定义max=0;然后遍历数组,比max大的值就将它赋给max,获得最大值,常规操作,应该都会
(2)重点然后再次遍历数组,将第一个数组值等于max的值置为-1(因为接下来求第二大的值,如果不将最大值置为-1,第二次求的值就会是最大值)。
(3)重复步骤(1),此时的max并不是原数组中的最大值,而是原数组中的第二大的值,如果没有步骤(2),就会出错

finally,觉得这道题很有意思,所以决定把心得分享出来,渣渣第一次写博客,代码和思路都写得不是很好,见谅QAQ~~~

java版的代码奉上:

import java.util.Arrays;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int M=sc.nextInt();
int N=sc.nextInt();
int K=sc.nextInt();
int L=sc.nextInt();
int D=sc.nextInt();
int[] x=new int[M];
int[] y=new int[N];
int[] xx=new int[K];
int[] yy=new int[L];
for(int i=0;i<D;i++)
{
int x0=sc.nextInt();
int y0=sc.nextInt();
int x1=sc.nextInt();
int y1=sc.nextInt();
if(x0x1)
y[Math.min(y0,y1)]=y[Math.min(y0,y1)]+1;
if(y0
y1)
x[Math.min(x0,x1)]=x[Math.min(x0,x1)]+1;
}

	 for(int i=0;i<K;i++)
	 {
		 int max=0;
		 for(int j=0;j<x.length;j++)
		 {
			 if(x[j]>max)
				 max=x[j];
		 }
		 for(int j=0;j<x.length;j++)
		 {
			 if(x[j]==max)
			 {
				 xx[i]=j;
				 x[j]=-1;
				 break;
			 }
		 }
	 }
	 for(int i=0;i<L;i++)
	 {
		 int max=0;
		 for(int j=0;j<y.length;j++)
		 {
			 if(y[j]>max)
				 max=y[j];
		 }
		 for(int j=0;j<y.length;j++)
		 {
			 if(y[j]==max)
			 {
				 yy[i]=j;
				 y[j]=-1;
				 break;
			 }
		 }
	 }
	 Arrays.sort(xx);
	 Arrays.sort(yy);
	 
	 for(int i=0;i<xx.length;i++)
	 {
		 if(i==xx.length-1)
			 System.out.print(xx[i]);
		 else
			 System.out.print(xx[i]+" ");
	 }
	 System.out.println();
	 for(int i=0;i<yy.length;i++)
	 {
		 if(i==yy.length-1)
			 System.out.print(yy[i]);
		 else
			 System.out.print(yy[i]+" ");
	 }
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值