卡片游戏 C/C++


有 n 张卡片堆成一摞,每张卡片自顶向下从 1 到 n 顺序编号。开始一个弃卡的游戏:每次抛弃该摞卡片中的最顶端卡片,然后把新的最顶端卡片(如果有)挪到最底部;并坚持操作 n 步,直到所有的卡片都被弃完。 假设第 i 步抛弃了编号为 j 的卡片,那么这次弃卡操作的代价为 j%i 分,请计算 n 次操作完成后的总代价。

输入数据

一个正整数 n,n < 1000000

输出数据

完成 n 次操作后的总代价。

样例输入

7

样例输出

​18

请用C或C++解决

定义大小为n的数组,抛弃一张后把上面的一张移到最后,定义变量统计循环次数。

这就是一个队列,可以考虑用链表,记住尾指针,不断变更head,把编号作为节点的值

#include <stdio.h>
#include <stdlib.h>

typedef struct _LINK
{
    int num;
    _LINK *next;
}LINKER;

LINKER *head,*tail;

void createlink(int n)
{
    LINKER *p;
    for(int i=1;i<=n;i++)
    {
        p = (LINKER*)malloc(sizeof(LINKER));
        p->next = NULL;
        p->num = i;
        if(head == NULL)
            head = p;
        else
            tail->next = p;
        tail = p;
    }
}

int move()
{
    int num = head->num;
    if(head == tail)
    {
        head = NULL;
    }
    else
    {
        head = head->next;
        tail->next = head;
        tail = tail->next;
        head = head->next;
    }
    return num;
}

int main()
{
    head = tail = NULL;
    int n,count = 0,sum = 0;
    scanf("%d",&n);
    createlink(n);
    while(head != NULL)
    {
        int num = move();
        count++;
        sum += num%count;
    }
    printf("sum=%d\n",sum);
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS
#include
#include

using namespace std;

#define MAX_N 15

int main103()
{
freopen("data5_3_h.in", "r", stdin);
freopen("data5_3_h.out", "w", stdout);

int num,first_ele;
while (cin>>num&&num!=0)
{
    queue<int,\24> card;  //使用队列进行模拟
    bool flag = false;
    for (int i = 1; i <= num; i++)
        card.push(i);
    cout << "Discarded cards: ";
    while (card.size()!=1)
    {
        if (!flag)
        {
            cout << card.front();
            if (card.size() != 2)
                cout << ", ";
        }
        else
            card.push(card.front());
        card.pop();
        flag = !flag;
    }
    cout << "\nRemaining card:" << card.front() << endl;
}

freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return 0;

}