有 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;
}