【牛客】Cow Contest

本文介绍了一道牛客网编程竞赛题目,使用Floyd算法确定参赛奶牛的技能排名。通过分析M场两两对决的结果,确定能够精确排名的奶牛数量。文章提供了详细的算法实现步骤及Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://ac.nowcoder.com/acm/contest/1069/K
来源:牛客网
 

题目描述

N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors.
The contest is conducted in several head-to-head rounds, each between two cows. If cow A has a greater skill level than cow B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B), then cow A will always beat cow B.
Farmer John is trying to rank the cows by skill level. Given a list the results of M (1 ≤ M ≤ 4,500) two-cow rounds, determine the number of cows whose ranks can be precisely determined from the results. It is guaranteed that the results of the rounds will not be contradictory.

输入描述:

* Line 1: Two space-separated integers: N and M
* Lines 2..M+1: Each line contains two space-separated integers that describe the competitors and results (the first integer, A, is the winner) of a single round of competition: A and B

输出描述:

* Line 1: A single integer representing the number of cows whose ranks can be determined

示例1

输入

复制

5 5
4 3
4 2
3 2
1 2
2 5

输出

复制

2

说明

Cow 2 loses to cows 1, 3, and 4. Thus, cow 2 is no better than any of the cows 1, 3, and 4. Cow 5 loses to cow 2, so cow 2 is better than cow 5.  Thus, cow 2 must be fourth, and cow 5 must be fifth. The ranks of the other cows cannot be determined.

 一道Floyd算法题,就是套板子,后期进行处理,在处理时要注意,不能确定名次的条件,1.dp[i,j]=dp[j,i]=0;即无法确定输赢;2.不能包含本身;

为什么说这个题是floyd算法呢?插点法确定两人之间是否有别的方式可以相连;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int M=sc.nextInt();
		int[][] dp=new int[N+1][N+1];
		for(int i=0;i<M;i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			dp[a][b]=1;
		}
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=N;j++) {
				for(int k=1;k<=N;k++) {
					if(dp[j][i]==1&&dp[i][k]==1) {
						dp[j][k]=1;
					}
				}
			}
		}
		int ans=0;
		for(int i=1;i<=N;i++) {
			int flag=1;
			for(int j=1;j<=N;j++) {
				if(i==j) continue;
				if(dp[i][j]==0&&dp[j][i]==0) {
					flag=0;
					break;
				}
			}
			if(flag==1) {
				ans++;
			}
		}
		System.out.println(ans);

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值