数据结构HW4

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值