XYNUOJ 1249 均分纸牌(playcard)—贪心算法

欢迎访问XYNUOJ

1249: 均分纸牌(playcard)

时间限制: 1 Sec   内存限制: 128 MB
提交: 11   解决: 7
[ 提交][ 状态][ 讨论版][ Edit] [ TestData]

题目描述

有 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
/*
**类型:贪心算法
**题目来源:HDU
**时间:2017/7/31
**输入: 查找贪心算法之均分纸牌问题http://blog.csdn.net/codebattle/article/details/29596937 
*/

#include<stdio.h>
int main()
{
	int m,count1=0,count2=0,time=0;
	int n[10000];
	scanf("%d",&m);
	for(int i=0;i<m;i++)
	{
		scanf("%d",&n[i]);
		count1=count1+n[i];
	}
	for(int i=0;i<m;i++)
	{
		count2=count2+n[i];
		if(count2!=(count1/m)*(i+1))
		{
			time++;
		}	
	}
	printf("%d\n",time);
	return 0;

}

int main(){
    int N;
    int pokers[MAX];
    cin>>N;
    int total = 0;
    for (int i=0; i<N; i++) {
        cin>>pokers[i];
        total+=pokers[i];
    }
    int avg = total/N,times=0;
    for(int i=0;i<N;i++){
        if(pokers[i]!=avg){
            pokers[i+1] -= avg - pokers[i];
            times++;
        }
    }
    cout<<times<<endl; 
}


扑克牌对弈 编程考试试题 题目: 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、付费专栏及课程。

余额充值