题目
古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?
输入格式:
输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:
K P[1] … P[K]
其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。
输出格式:
首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
- 输入样例 1:
10 4
4 -1 2 -3 4
4 2 -3 -5 -6
3 2 4 -5
3 -6 0 2
-3 2
- 输出样例 1:
-3 2
2 -5
2 -6
- 输入样例 2:
4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2
- 输出样例 2:
-3 2
题解(编者的错解,能过一半,后一半其中一个错误,其他超时,不知道为什么错误,没想到什么极端样例能让其不过,思想和下面给出的正解几乎一致)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;/*** @author akuya* @create 2023-10-31-15:15*/
public class love {static int N=1005;static double arr[][]=new double[N][N];static int sex[]=new int[N];static int n,m;static PriorityQueue<Integer> lpq=new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Math.abs(o1)-Math.abs(o2);}});static PriorityQueue<Integer> opq=new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Math.abs(o1)-Math.abs(o2);}});public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String nm[]=br.readLine().split(" ");n=Integer.parseInt(nm[0]);m=Integer.parseInt(nm[1]);while(m--!=0){String kn[]=br.readLine().split(" ");int k=Integer.parseInt(kn[0]);for(int i=1;i<k;i++){for(int j=i+1;j<=k;j++){int x=Integer.parseInt(kn[i]);int y=Integer.parseInt(kn[j]);int ax=Math.abs(x);int ay=Math.abs(y);if(kn[i].charAt(0)=='-'){sex[ax]=-1;}else{sex[x]=1;}if (kn[j].charAt(0)=='-') {sex[ay]=-1;}else{sex[y]=1;}double ans=(double)1/k;arr[ax][ay]+=ans;arr[ay][ax]+=ans;}}}String lo[]= br.readLine().split(" ");int l=Integer.parseInt(lo[0]);int o=Integer.parseInt(lo[1]);int al=Math.abs(l);int ao=Math.abs(o);double lmax=-1;double omax=-1;for(int i=0;i<n;i++){if(l*sex[i]<0){if(arr[al][i]>lmax){lpq.clear();lpq.add(sex[i]*i);lmax=arr[al][i];}else if(arr[al][i]==lmax){lpq.add(sex[i]*i);}}}for(int i=0;i<n;i++){if(o*sex[i]<0){if(arr[ao][i]>omax){opq.clear();opq.add(sex[i]*i);omax=arr[ao][i];}else if(arr[ao][i]==omax){opq.add(sex[i]*i);}}}if(lpq.contains(o)&&opq.contains(l)){System.out.println(l+" "+o);return;}while(!lpq.isEmpty()){System.out.println(l+" "+lpq.poll());}while(!opq.isEmpty()){System.out.println(o+" "+opq.poll());}}
}
正解
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author akuya* @create 2023-11-01-11:57*/
public class Main {static int N=1005;static List<Integer> tree =new ArrayList<>();static int n,flag=0;static int a[]=new int[N];public static void main(String[] args) {Scanner scanner=new Scanner(System.in);n=scanner.nextInt();for(int i=1;i<=n;i++) a[i]=scanner.nextInt();creat(1,n);if(tree.size()!=n){flag=1;tree.clear();creat(1,n);}if(tree.size()==n){System.out.println("YES");int len=tree.size();int log=1;for(int i:tree){if(log==len){System.out.println(i);}elseSystem.out.print(i+" ");log++;}}else System.out.println("NO");}public static void creat(int root,int last){if(root>last) return;int left=root+1;int right=last;if(flag==0){while(left<=last&&a[left]<a[root]) ++left;while(right>root&&a[right]>=a[root]) --right;}else{while(left<=last&&a[left]>=a[root]) ++left;while(right>root&&a[right]<a[root]) --right;}if(right!=(left-1)) return;creat(root+1,right);creat(left,last);tree.add(a[root]);}}
思路
这道题的思路挺简单,就是用一个动态数组存储照片中的人,用一个数组存储性别,然后n2遍历即可做出。