1
Joseph Problem(35分)
题目内容:
實作Joseph problem.
假設一開始有N個人,編號1~N,
按照順序以順時針圍成一個圓圈。
遊戲開始時,編號1的人拿刀。
之後每一輪刀子會被往下傳M個人,
而當輪最後拿到刀子的人會將他的下一個人殺掉,
殺完後刀子會再傳給被殺的下一個人。
這樣一輪就算結束。
遊戲會進行許多輪,直到只剩下最後一個人。
範例1:N=5, M=2
第一輪:刀子傳給3號,4號被殺,刀子再傳給5號 (1 2 3 5)
第二輪:刀子傳給2號,3號被殺,刀子再傳給5號 (1 2 5)
第三輪:刀子傳給2號,5號被殺,刀子再傳給1號 (1 2)
第四輪:刀子傳給1號,2號被殺,最後1號存活。
範例2:N=4, M=3
第一輪:刀子傳給4號,1號被殺,刀子再傳給2號 (2 3 4)
第二輪:刀子傳給2號,3號被殺,刀子再傳給4號 (2 4)
第三輪:刀子傳給2號,4號被殺,最後2號存活。
输入格式:
輸入第一行為一個數字T,代表測資的筆數。
接下來會有T筆測資,每一筆測資一行,
會有兩個數字N,M,數字間以空格區隔。
數字範圍:
T < 1000
0 < N <= 1000
0 < M <= 1000
输出格式:
輸出一行數字,將每筆測資最後存活下來的人的編號加總。
输入样例:
3
5 2
4 3
8 4
输出样例:
4
#include<iostream>
using namespace std;
class node {
public:
int x;
node *next;
node() {}
node(int i) :x(i) {}
};
node *head, *tail;
void Print() {
node *c = head;
while (c != tail) {
cout << c->x << " ";
c = c->next;
}
cout << c->x;
}
int main() {
int t, all = 0;
cin >> t;
int sum = 0;
while (t--) {
node *current, *d;
int n,m, m0;
cin >> n >> m;
head = new node[sizeof(node)];
head->x = 1;
node *head0 = head;
for (int i = 2; i <= n; ++i)
{
current = new node[sizeof(node)];
current->x = i;
head0->next = current;
head0 = current;
}
current->next = head;
current = head;
while (current->next != current) {
m0 = m;
while (m0--) {
current = current->next;
}
cout << "killer=" << current->x << endl;
d = current->next;
cout << "delete"<<d->x<<endl;
current->next = current->next->next;
current = current->next;
delete[]d;
}
sum += current->x;
}
cout << sum;
getchar(); getchar();
}
2
Line up(30分)
题目内容:
實作一個排隊系統,
指令有以下三種:
指令0 x: 代表insert,將編號x加入排隊隊伍的最尾端。
指令1: 代表serve,為隊伍中最前面的人提供服務,服務完後自動將他從隊伍中剔除,如果隊伍為空則忽略這個指令。
指令2: 代表dismiss: 將隊伍全部清空。
输入格式:
只有一組測資,
測資第一行為一個數字N,代表接下來有N行指令。每行指令個格式如題目敘述。
測資範圍
0 < N < 20000
0 < x < 100000
输出格式:
將所有serve的編號加總,輸出總和。
Hint : 注意overflow!
输入样例:
10
0 5
0 6
0 8
0 4
1
1
1
2
0 3
1
输出样例:
22
#include<iostream>
using namespace std;
int main() {
int t;
cin >> t;
int *a = new int[t];
int sum = 0;
int head=0,tail=0;
int x,y;
while (t--) {
cin >> x;
switch (x) {
case 0:
cin >> y;
a[tail++] = y;
break;
case 1:
if (tail - head == 0) {
continue;
}
sum += a[head++];
break;
case 2:
head = tail;
break;
}
}
cout << sum;
getchar(); getchar();
}
3
#include<iostream>
#include<string>
using namespace std;
int main() {
int t,size,b[2000],sum=0;
cin >> t;
char a[2000];
while (t--) {
cin.get(a,2000);
size = strlen(a);
if (size == 0) {
++sum;//这里有问题,我不知道怎么输入空字符串
cout << "sum=" << sum << endl;
continue;
}
b[0] = a[0];
int j = 0;
for (int i = 1; i < size; ++i) {
if (a[i] == ')' || a[i] == ']' || a[i] == '}' || a[i] == '>') {
if (b[j] == '('&&a[i] == ')'){
--j;
continue;
}else if (b[j] == '['&&a[i] == ']') {
--j;
continue;
}
else if (b[j] == '<'&&a[i] == '>') {
--j;
continue;
}
else if (b[j] == '{'&&a[i] == '}') {
--j;
continue;
}
else {
j = 10;
break;
}
}
++j;
b[j] = a[i];
}
if (j == -1)
++sum;
cout << "sum=" << sum << endl;
}
cout << sum;
}