ZCMU-1040:二哥的困惑Ⅲ(贪心)

本文介绍了一个特殊卡片游戏的策略分析,玩家通过出牌竞争胜利。文章详细解释了游戏规则,并提供了一种有效的算法来确定玩家至少能赢得多少轮比赛。

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

1040: 二哥的困惑 Ⅲ

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 216  Solved: 84
[Submit][Status][Web Board]

Description

 

Suppose there are M people, including you, playing a special card game. At the beginning, each player receives N cards. The pip of a card is a positive integer which is at most N*M. And there are no two cards with the same pip. During a round, each player chooses one card to compare with others. The player whose card with the biggest pip wins the round, and then the next round begins. After N rounds, when all the cards of each player have been chosen, the player who has won the most rounds is the winner of the game.

 

Given your cards received at the beginning, write a program to tell the maximal number of rounds that you may at least win during the whole game.

Input

 

 

The input consists of several test cases. The first line of each case contains two integers m (2<=m<=20) and n (1<=n<=50), representing the number of players and the number of cards each player receives at the beginning of the game, respectively. This followed by a line with n positive integers, representing the pips of cards you received at the beginning. Then a blank line follows to separate the cases. 

The input is terminated by a line with two zeros.

 

Output

 

 

For each test case, output a line consisting of the test case number followed by the number of rounds you will at least win during the game.

 

Sample Input

2 5

1 7 2 10 9

6 11

62 63 54 66 65 61 57 56 50 53 48

0 0

Sample Output

Case 1: 2

Case 2: 4

HINT

 

Source

 

【解析】

题意:m个玩家,给你n张牌,所有牌的编号为1-m*n。给你你所拥有的牌,每人每局出一张牌,问,你至少能赢几把。

贪心很明显了。

我的做法是,从m*n开始遍历,代表你每次都出最大的牌,如果最大的你有了,那你肯定赢了,now++,然后及时更新ans。  如果当前最大的你没有,那么人家就可能比你大。所以now--。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n, m, num[55], flag[1010], ca = 0;
	while (scanf("%d%d", &m, &n))
	{
		if (!m&&!n)break;
		memset(flag, 0, sizeof(flag));
		int ans = 0, now = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &num[i]);
			flag[num[i]] = 1;
		}
		for (int i = m * n; i > 0; i--)
		{
			if (flag[i])
			{
				now++;
				if (now > ans)
					ans = now;
			}
			else
				now--;
		}
		printf("Case %d: %d\n", ++ca, ans);
	}

	return 0;
}

 

### zcmu Java 题解与代码实现 在讨论与 zcmu 相关的 Java 内容时,可以参考一些常见的算法题解和代码实现。以下是基于提供的引用内容以及其他知识背景生成的内容。 #### 1. Java 实现字符串头尾相连问题 此问题的核心在于判断一个字符串是否可以通过头尾相连后形成回文串。通过将字符串复制并反转,检查原字符串是否为反转后字符串的子串来实现[^5]。 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); scanner.nextLine(); // 清除换行符 while (t-- > 0) { String xl = scanner.nextLine(); String s = xl + xl; // 将字符串复制一遍 StringBuilder reversed = new StringBuilder(s).reverse(); // 反转字符串 if (reversed.toString().contains(xl)) { // 判断是否包含原字符串 System.out.println("YES"); } else { System.out.println("NO"); } } } } ``` #### 2. Java 实现最短路径问题 对于类似灯塔覆盖范围的问题,可以通过遍历所有灯塔并更新可达范围来解决。如果能够到达终点且返回起点,则答案为 `(终点 - 起点) * 3`,否则输出 `-1`[^3]。 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); while (t-- > 0) { int n = scanner.nextInt(); long startX = scanner.nextLong(); long startR = scanner.nextLong(); long m = startX + startR; boolean canReach = true; for (int i = 1; i < n; i++) { long x = scanner.nextLong(); long r = scanner.nextLong(); if (x <= m && x + r > m) { m = x + r; } else if (x > m) { canReach = false; break; } } if (!canReach || startX > m) { System.out.println("-1"); continue; } m = startX - startR; for (int i = n - 2; i >= 0; i--) { long x = scanner.nextLong(); long r = scanner.nextLong(); if (x >= m && x - r < m) { m = x - r; } else if (x < m) { canReach = false; break; } } if (!canReach || startX < m) { System.out.println("-1"); } else { System.out.println((startX - startX) * 3); } } } } ``` #### 3. Java 实现字符串统计问题 对于字符串统计问题,可以使用 `HashMap` 来记录每个字符串出现的次数,并找到出现次数最多的字符串[^2]。 ```java import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNextInt()) { int n = scanner.nextInt(); if (n == 0) break; Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < n; i++) { String str = scanner.next(); map.put(str, map.getOrDefault(str, 0) + 1); } String result = ""; int maxCount = 0; for (Map.Entry<String, Integer> entry : map.entrySet()) { if (entry.getValue() > maxCount) { maxCount = entry.getValue(); result = entry.getKey(); } } System.out.println(result); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值