葱葱跟巴豆玩游戏。游戏规则很简单,就是比大小。

参看:
https://blog.csdn.net/jianglw1/article/details/83041773

葱葱跟巴豆玩游戏。游戏规则很简单,就是比大小。

他们各自从牌堆里随机抽出 十一张牌,
牌上面标有数字N,0 同一数字的牌只有一张,不会重复。
然后他们各自从手里拿出一张牌比大小,
牌数大的得一点分数,最后谁得到的分多谁就胜利。
葱葱耍了点小手段,知道巴豆的手牌,以及巴豆的出牌顺序

那么葱葱最多可以拿几分呢?
现在给出两行数据,第一行有十一个数字为葱葱的手牌,
第二行也有十一个数字是巴豆的手牌。
输出为葱葱最多可以拿几分。

输入
测试数据有多组,每组测试数据包括2行:
每行有十一个数字N,0 输出
输出整数M,M为葱葱 最多可以 拿到的分数。

样例输入
12 13 14 15 16 17 18 19 20 21 22
1 2 3 4 5 6 7 8 9 10 n
样例输出
n

贪心算法 类似:田忌赛马问题
这个题目贪心的本质在于:(浪费别人好马,节约自己的好马)
*田忌只在有把握赢的情况下(能赢就赢) 拿出 快马(比王的马要稍微较快点的马(不要浪费更好的马))和王比,
否则用 最慢(尽可能慢)的马(最大程度 浪费)掉王的快马

贪心策略:
明确一个方向入手;迭代减小规模.
1,
如果田忌的最快马快于齐王的最快马,则两者比。
(因为若是田忌的别的马很可能就赢不了了,所以两者比)
2,
如果田忌的最快马慢于齐王的最快马,则用田忌的 最慢马和齐王的最快马比。
(由于所有的马都赢不了齐王的最快马,所以用损失最小的,拿最慢的和他比)
3,!!!
若相等,则比较田忌的最慢马和齐王的最慢马
a.若田忌最慢马 快于 齐王最慢马,两者比。(在这两场比赛中,田忌能赢1场,最慢的马能用来赢,何乐而不为.)
(田忌的最慢马既然能赢一个就赢,而且齐王的最慢马肯定也得有个和他比,)
b.其他,则拿田忌的最慢马和齐王的最快马比。
(反正所有的马都比田忌的最慢马快了,所以这匹马必输,选贡献最大的,干掉齐王的最快马)


#include 
#include 
#include 
#include 
// // 拷贝到平台的时候把my_fuction_lib.h注释掉.
//#include "my_fuction_lib.h"

//在此下方插入自定义函数对的声明:
void swap_int_pointer(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
/* 指针版冒泡排序(整数版) (两重for,一个if_swap()*/
void bubble_int_sort(int *p, int n)
{
    void swap_int_pointer(int *a, int *b);
    /* 冒泡 枚举图解:https://img02.sogoucdn.com/app/a/100520146/2ebb85e6d696706cd231a745c593b1dd*/
    /*冒泡法不需要设立最值flag. */
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j <= n - 2 - i; j++)
        {
            /*通过改变'<'为'>',可以从降序转为升序; 通过监视*(p+j)和*(p+j+1)可以知道当前(第j组)相邻量的值的情况 */
            if (*(p + j) < *(p + j + 1)) 
            {
                swap_int_pointer(p + j, p + j + 1);
            }
        }
    }
}
//主函数main
int main()
{
    //复制模版式删除这个或者再下面一个
    int n = 11;
    int *p;//田忌马(葱葱)
    int *q;//王马(巴豆)
    
    int size_int = sizeof(int);
    p = (int *)malloc(n * size_int);
    q = (int *)malloc(n * size_int);
    while (scanf("%d", p) != EOF)//注意了,malloc必须安排再scanf之前,否则无法读入(指针找不到内存)
    {

        for (int i = 1; i < n; i++)
        {
            scanf("%d", p + i);
        }
        for (int i = 0; i < n; i++)
        {
            scanf("%d",q+i);
        }

        bubble_int_sort(p, n);
        bubble_int_sort(q, n);

        int win = 0;
        /* 将参加比赛的马的位置 置为0,以便重新排序,实现迭代 */
        for (int i = 0,j = 0; j < n; j++)
        {
            if (*(p + i) > *(q+i))
            {
                win++;
                *(p+i) = *(q+i) = 0;
            }
            else if (*(p+i) < *(q+i))
            {
                /* 田忌的最差马和王的最优马比 */
                *(p+n-1) = *(q) =  0;
            }
            else /* 双方快马一样快. */
            {
                /*比较最慢的马的状况 */
                if(*(p+n-1) > *(q+n-1))/* 田忌最慢马能赢过王的最慢马. */
                {
                    win++;
                    *(p+n-1) = *(q+n-1) = 0;
                }
                else/* 其他情况,则让田忌最慢的马和王的最优马比 */
                {
                    *(p+n-1) = *q = 0 ;
                    /* 这一场田忌输. */
                }            
            }
            /* 待优化 */
            i = 0;
            /* 重新排序 */
            bubble_int_sort(p, n);
            bubble_int_sort(q, n);
            
        }
        printf("%d\n",win);
    }
        return 0;
}

你可能感兴趣的:(葱葱跟巴豆玩游戏。游戏规则很简单,就是比大小。)