XYOJ1249: 均分纸牌(playcard)

题目描述

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如 N=4,4 堆纸牌数分别为:  ① 9 ② 8 ③ 17 ④ 6

移动3次可达到目的:

从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

输入

第一行N。第二行A1 A2 … An (每堆纸牌初始数)

输出

所有堆均达到相等时的最少移动次数。 (1 <= N <= 100,l<= Ai <=10000 )

样例输入

4
9 8 17 6

样例输出

3

//思路:很神奇的一件事 从第一个开始一个一个的去满足条件,不满足的向后借,多余的给予后面的那个,所以除了刚好满足条件外其他的都会影响下一个的值,所以这就是解决此问题的出发点a[i+1]=a[i]+a[i+1]-s。
#include<stdio.h>
int main(){
	int N,a[10001];
	scanf("%d",&N);
	int s=0,m=0;
	for(int i=0;i<N;i++){
		scanf("%d",&a[i]);
		s+=a[i];
	}
	s/=N;
	for(int i=0;i<N;i++){
		if(a[i]==s){
			continue;//
		}
		else{
			a[i+1]=a[i]+a[i+1]-s;
			m++;
		}
	}
	printf("%d\n",m);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
扑克牌对弈 编程考试试题 题目: 4 个人甲乙丙丁在一起玩一副扑克纸牌,每纸牌按照数字计分,不同花色的相同数字的纸牌分值一样。 其中 1-10 各种花色的纸牌分别为 1-10,J、Q、K 分别被记为 11,12,13,大王和小王分别记为 20。四种花 色(方片,梅花、红桃、黑桃)分别被记为 A、B、C、D。如红桃 K 表示为 13C,分值为 13;方片 5 表示 为 5A,分值为 5。大王表示为 20K,分值为 20,小王表示为 20Q,分值为 20,54 纸牌叠在一起倒扣在 桌子上。 游戏过程如下: 1. 洗牌:54 纸牌随机顺序组合。 2. 4 人排序:随机产生 4 人的拿牌顺序,出牌顺序与拿牌顺序相同。第一个人拿牌,即第一个人出牌。 3. 4 人排序后,两两组队,按照顺序第 1 人和第 3 人组成 1 队,第 2 人和第 4 人组成 1 对。 4. 分牌:按拿牌顺序每人轮流拿牌,每人拿 13 纸牌,最后两纸牌留在桌面。 5. 信息:每个人不知道其他人的牌,也不知道留在桌面上的牌,可以获得的信息包括自己持有的牌和 4 个人出过的牌。队内的成员可以在每一轮沟通出牌的策略。 6. 出牌:从第一个拿牌的人开始出牌(可以选择最大获胜机会的策略),每一轮 4 人出牌,然后比大 小,拥有牌最大的人获取当前轮次的 4 牌。出过的牌后面不可以再出。大小判定规则,纸牌分值 (大) > 纸牌分值(小),相同纸牌分值,按照黑桃>红桃>梅花>方片的顺序判定大小。 7. 判定胜负:每个人手中的牌的分值总和为每个人的得分,每队的得分为两个人得分的和,得分最大的 队伍者获胜,如果两队得分相同,则平局。 编程要求: 8. 代码实现要考虑到扩展性。要在牌的分值,大小比较规则发生变化时,代码能够很容易地扩展和支 持。 请使用C#语言实现
最新发布
07-17
以下是使用C#语言实现扑克牌对弈游戏的代码示例: ```csharp using System; using System.Collections.Generic; public class Card { public string Suit { get; set; } public int Value { get; set; } public Card(string suit, int value) { Suit = suit; Value = value; } } public class Player { public string Name { get; set; } public List<Card> Hand { get; set; } public Player(string name) { Name = name; Hand = new List<Card>(); } public int GetTotalScore() { int score = 0; foreach (Card card in Hand) { score += card.Value; } return score; } } public class Game { private List<Card> deck; private List<Player> players; public Game() { deck = new List<Card>(); players = new List<Player>(); // 初始化一副扑克牌 InitializeDeck(); // 初始化四个玩家 InitializePlayers(); } public void StartGame() { // 洗牌 ShuffleDeck(); // 分发牌 DealCards(); // 游戏循环,直到没有剩余牌 while (deck.Count > 0) { foreach (Player player in players) { // 玩家出牌 PlayCard(player); // 判断胜负 if (deck.Count == 0) { break; } } } // 打印最终结果 PrintScores(); } private void InitializeDeck() { string[] suits = { "A", "B", "C", "D" }; int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20 }; foreach (string suit in suits) { foreach (int value in values) { deck.Add(new Card(suit, value)); } } } private void InitializePlayers() { string[] names = { "甲", "乙", "丙", "丁" }; foreach (string name in names) { players.Add(new Player(name)); } } private void ShuffleDeck() { Random random = new Random(); int n = deck.Count; while (n > 1) { n--; int k = random.Next(n + 1); Card card = deck[k]; deck[k] = deck[n]; deck[n] = card; } } private void DealCards() { int currentPlayer = 0; int cardsPerPlayer = deck.Count / players.Count; for (int i = 0; i < cardsPerPlayer; i++) { foreach (Player player in players) { player.Hand.Add(deck[0]); deck.RemoveAt(0); } } } private void PlayCard(Player player) { Console.WriteLine(player.Name + "出牌: " + player.Hand[0].Value + player.Hand[0].Suit); // 处理出牌逻辑 player.Hand.RemoveAt(0); } private void PrintScores() { Console.WriteLine("游戏结束,得分如下:"); foreach (Player player in players) { Console.WriteLine(player.Name + "的得分为: " + player.GetTotalScore()); } } } public class Program { public static void Main(string[] args) { Game game = new Game(); game.StartGame(); } } ``` 这段代码实现了扑克牌对弈游戏的基本逻辑,并提供了扩展性。你可以根据需要修改牌的分值和大小比较规则,代码能够很容易地进行扩展和支持。 注意:这只是一个简单的示例代码,实际使用中可能还需要添加更多的逻辑和错误处理。编写完整的游戏逻辑可能需要更多的工作量和设计考量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值