简单贪心算法应用 洛谷 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 {
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;imax)
				 max=x[j];
		 }
		 for(int j=0;jmax)
				 max=y[j];
		 }
		 for(int j=0;j

}

你可能感兴趣的:(贪心算法)