PKU《程序設計導引及在線實踐》刷題記錄

2.1 雞兔同籠

#include <cstdio>

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		int total;
		int chi, rab;
		scanf("%d", &total);
		if (total % 2 != 0) {
			printf("0 0\n");
			continue;
		}
		else
			printf("%d %d\n", total / 4 + (total - total / 4 * 4) / 2, total / 2);
	}
	return 0;
}

2.2棋盤上的距離

#include <cstdio>
#include <cmath>

int main() {
	int ncases;
	scanf("%d", &ncases);
	while (ncases--) {
		int dx, dy;
		char x[5], y[5];
		scanf("%s %s", x, y);
		dx = abs(y[0] - x[0]);
		dy = abs(y[1] - x[1]);
		//王
		printf("%d ", dx > dy ? dx : dy);
		//後
		if (dx == 0 || dy == 0 || dx == dy)
			printf("1 ");
		else
			printf("2 ");
		//車
		if (dx == 0 || dy == 0)
			printf("1 ");
		else
			printf("2 ");
		//象
		if (dx != dy)
			printf("Inf\n");
		else
			printf("1\n");
	}
	return 0;
}

2.3 校門外的樹

#include <cstdio>
#include <algorithm>
using namespace std;

int tree[10010];

int main() {
	int L, M;
	scanf("%d %d", &L, &M);
	fill(tree, tree + L + 1, 1);
	for (int i = 0; i < M; i++) {
		int begin, end;
		scanf("%d %d", &begin, &end);
		fill(tree + begin, tree + end + 1, 0);
	}
	int ans = 0;
	for (int i = 0; i <= L; i++)
		ans += tree[i];
	printf("%d", ans);
	return 0;
}

2.4填詞

#include <cstdio>

int main() {
	char c;
	int num[30] = { 0 };
	int M, N, P;
	scanf("%d %d %d", &M, &N, &P);
	getchar();
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			scanf("%c", &c);
			num[c - 'A']++;
		}
		getchar();
	}
	for (int i = 0; i < P; i++) {
		char temp[500];
		scanf("%s", temp);
		for (int j = 0; temp[j] != '\0'; j++)
			num[temp[j] - 'A']--;
	}
	for (int i = 0; i < 26; i++) {
		while (num[i] != 0) {
			printf("%c", i + 'A');
			num[i]--;
		}
	}
	return 0;
}

2.5裝箱問題
太菜了,沒想到這題居然還是不會,沒學好啊

#include <cstdio>

int main() {
	while (1) {
		int ans = 0;
		int a, b, c, d, e, f;//用來存放訂單數
		int x, y;//x表示剩下2*2的空間的數量,y表示剩下1*1的空間的數量
		scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f);
		if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
			break;
		int left[4] = { 0,5,3,1 };
		ans = f + e + d + (c + 3) / 4;
		x = 5 * d + left[c % 4];
		if (b > x)
			ans += (b - x + 8) / 9;
		x = 36 * ans - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
		if (a > x)
			ans += (a - x + 35) / 36;
		printf("%d\n", ans);
	}
	return 0;
}

3.1確定進制
太菜了!!怎麼感覺自己還不如第一遍刷題的自己??居然忘了進制轉換的時候,如果有個要被轉換的數比product大,應當退出!!

#include <cstdio>

int Change(char p[], int product) {
	int ans = 0;
	for (int i = 0; p[i] != '\0'; i++) {
		if (p[i] - '0' >= product)
			return -1;
		ans = ans * product + p[i] - '0';
	}
	return ans;
}

int main() {
	char p[10], q[10], r[10];
	scanf("%s %s %s", p, q, r);
	for (int i = 2; i <= 16; i++) {
		int a = Change(p, i);
		int b = Change(q, i);
		int c = Change(r, i);
		if (a*b == c) {
			printf("%d", i);
			return 0;
		}
	}
	printf("0");
	return 0;
}

3.2相鄰數字的基數不等比:skew數

#include <cstdio>
#include <cstring>

int main() {
	int base[32];
	base[0] = 1;
	for (int i = 1; i < 32; i++)
		base[i] = 2 * base[i - 1] + 1;
	while (1) {
		char p[40];
		scanf("%s", p);
		if (p[0] == '0')
			break;
		long long ans = 0;
		int len = strlen(p);
		for (int i = len - 1; i >= 0; i--) {
			ans += (p[i] - '0')*base[len - i - 1];
		}
		printf("%ld\n", ans);
	}
	return 0;
}

4.2統計字符數

#include <cstdio>
#include <cstring>

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		char str[1010];
		scanf("%s", str);
		int num[30] = { 0 };
		int MAXID = 0;
		for (int i = 0; str[i] != '\0'; i++) 
			num[str[i] - 'a']++;
		for (int i = 1; i < 26; i++) {
			if (num[i] > num[MAXID])
				MAXID = i;
		}
		printf("%c %d\n", 'a' + MAXID, num[MAXID]);
	}
	return 0;
}

4.3 487-3279

#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using namespace std;

int main() {
	map<string, int> mp;
	int n;
	scanf("%d", &n);
	while (n--) {
		string s;
		cin >> s;
		string temp;
		//輸入字符串並進行映射
		for (int i = 0; s[i] != '\0'; i++) {
			if (s[i] == 'A' || s[i] == 'B' || s[i] == 'C') {
				temp += "2";
			}
			if (s[i] == 'D' || s[i] == 'E' || s[i] == 'F') {
				temp += "3";
			}
			if (s[i] == 'G' || s[i] == 'H' || s[i] == 'I') {
				temp += "4";
			}
			if (s[i] == 'J' || s[i] == 'K' || s[i] == 'L') {
				temp += "5";
			}
			if (s[i] == 'M' || s[i] == 'N' || s[i] == 'O') {
				temp += "6";
			}
			if (s[i] == 'P' || s[i] == 'R' || s[i] == 'S') {
				temp += "7";
			}
			if (s[i] == 'T' || s[i] == 'U' || s[i] == 'V') {
				temp += "8";
			}
			if (s[i] == 'W' || s[i] == 'X' || s[i] == 'Y') {
				temp += "9";
			}
			if (s[i] >= '0'&&s[i] <= '9')
				temp += s[i];
		}
		temp.insert(temp.begin() + 3, '-');
		if (mp.count(temp) != 0)
			mp[temp]++;
		else
			mp[temp] = 1;
	}
	bool flag = false;
	for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++) {
		if (it->second > 1) {
			cout << it->first << " " << it->second << endl;
			flag = true;
		}
	}
	if (flag == false)
		cout << "No duplicates.";
	return 0;
}

4.4子串

#include <iostream>
#include <string>
using namespace std;

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		int t;
		cin >> t;
		string str[110];
		string min;
		cin >> str[0];
		min = str[0];
		for (int i = 1; i < t; i++) {
			cin >> str[i];
			if (str[i].length() < min.length())
				min = str[i];
		}
		int minlen = min.length();
		int i;
		bool flag = false;
		for (i = minlen; i > 0; i--) {//子串長度從最長開始逐次遞減
			for (int j = 0; j + i <= minlen; j++) {//子串起始位置枚舉
				string temp;
				temp.insert(temp.begin(), min.begin() + j, min.begin() + i + j);
				flag = true;
				for (int k = 0; k < t; k++) {
					if (str[k] == min)
						continue;
					string rev;
					for (int s = str[k].length() - 1; s >= 0; s--)
						rev += str[k][s];
					if (str[k].find(temp) == string::npos&&rev.find(temp) == string::npos) {
						flag = false;
					}
				}
				if (flag == true)
					break;
			}
			if (flag == true) {
				printf("%d\n", i);
				break;
			}
		}
		if (flag == false)
			printf("0\n");
	}
	return 0;
}

4.5最難的問題

#include <iostream>
#include <string>
using namespace std;

int main() {
	while (1) {
		string start, end, sent;
		getline(cin, start);
		if (start == "ENDOFINPUT")
			break;
		getline(cin, sent);
		getline(cin, end);
		string ans;
		for (int i = 0; sent[i] != '\0'; i++) {
			if (sent[i] >= 'A'&&sent[i] <= 'Z')
				ans += (sent[i]-'A' + 26 - 5) % 26 + 'A';
			else
				ans += sent[i];
		}
		cout << ans << endl;
	}
	return 0;
}

5.1判斷閏年

#include <cstdio>

int main() {
	int year;
	scanf("%d", &year);
	if (year % 4 != 0)
		printf("N");
	else {
		if (year % 3200 == 0) {
			printf("N");
			return 0;
		}
		if (year % 100 == 0)
			if (year % 400 != 0) {
				printf("N");
				return 0;
			}
		printf("Y");
	}
	return 0;
}

5.2細菌繁殖

#include <cstdio>

int main() {
	int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int n;
	scanf("%d", &n);
	while (n--) {
		int Mst, Dst, Men, Den;
		long long num;
		scanf("%d %d %lld %d %d", &Mst, &Dst, &num, &Men, &Den);
		int lag = 0;
		while (Mst != Men || Dst != Den) {
			lag++;
			if (Dst == month[Mst]) {
				Dst = 1;
				Mst++;
			}
			else
				Dst++;
		}
		for (int i = 0; i < lag; i++)
			num += num;
		printf("%lld\n", num);
	}
	return 0;
}

5.3 日曆問題

#include <cstdio>
int month[2][13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 };
char week[7][10] = { "Saturday","Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
int year[2] = { 365,366 };

bool IsRun(int year) {
	if (year % 4 != 0)
		return false;
	if (year % 100 == 0 && year % 400 != 0)
		return false;
	return true;
}

int main() {
	while (1) {
		int lag;
		scanf("%d", &lag);
		if (lag == -1)
			break;
		int temp = 0;
		int Y = 2000, M = 1, D = 1;
		while (temp != lag) {
			bool flag = IsRun(Y);
			if (lag - temp > year[flag]) {
				temp += year[flag];
				Y++;
			}
			else {
				temp++;
				if (D == month[flag][M]) {
					D = 1;
					M++;
					if (M == 13) {
						M = 1;
						Y++;
					}
				}
				else
					D++;
			}
		}
		printf("%04d-%02d-%02d %s\n", Y, M, D, week[lag % 7]);
	}
	return 0;
}

5.4瑪雅歷
這題一開始就不會做=-=,現在看到這個題還是犯怵。。。太菜了

#include <cstdio>
#include <cstring>

char maya[19][10] = { "pop","no","zip","zotz","tzec","xul","yoxkin","mol",
					"chen","yax","zac","ceh","mac","kankin","muan","pax",
					"koyab","cumhu","uayet"};
char holly[20][10] = { "imix","ik","akbal","kan","chicchan","cimi","manik",
					"lamat","muluk","ok","chuen","eb","ben","ix","mem","cib",
					"caban","eznab","canac","ahau" };

int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", n);
	while (n--) {
		int day, year;
		char mon[10];
		int sum = 0;
		scanf("%d. %s %d", &day, mon, &year);
		sum += year * 365;
		for (int i = 0; i < 19; i++) {
			if (strcmp(maya[i], mon) == 0) {
				sum += i * 20;
				break;
			}
		}
		sum += day;
		printf("%d %s %d\n", sum % 13 + 1, holly[sum % 20], sum / 260);
	}
	return 0;
}

5.5 時區間時間的轉換

#include <cstdio>
#include <string.h>

int difference(char zone1[], char zone2[]) {
	char zone[32][7] = {
		"UTC","GMT","BST","IST","WET","WEST","CET","CEST",
		"EET","EEST","MSK","MSD","AST","ADT","NST","NDT",
		"EST","EDT","CST","CDT","MST","MDT","PST","PDT",
		"HST","AKST","AKDT","AEST","AEDT","ACST","ACDT","AWST" };
	double time[32] = { 0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,
		-5,-7,-6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8 };
	int i, j;
	for (i = 0; strcmp(zone[i], zone1) != 0; i++);
	for (j = 0; strcmp(zone[j], zone2) != 0; j++);
	return (int)((time[i] - time[j]) * 60);
}

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		char time[9];
		int hours, minutes;
		scanf("%s", time);
		switch (time[0]) {
		case'n':
			hours = 12;
			minutes = 0;
			break;
		case'm':
			hours = 0;
			minutes = 0;
			break;
		default:
			sscanf(time, "%d:%d", &hours, &minutes);
			hours %= 12;
			scanf("%s", time);
			if (time[0] == 'p')
				hours += 12;
		}
		char timezone1[7], timezone2[7];
		scanf("%s %s", timezone1, timezone2);
		int newtime;
		newtime = hours * 60 + minutes + difference(timezone2, timezone1);
		if (newtime < 0)
			newtime += 1440;
		newtime %= 1440;
		switch (newtime) {
		case 0:
			printf("midnight\n"); break;
		case 720:
			printf("noon\n"); break;
		default:
			hours = newtime / 60;
			minutes = newtime % 60;
			if (hours == 0)
				printf("12:%02d a.m.\n", minutes);
			else if (hours < 12)
				printf("%d:%02d a.m.\n", hours, minutes);
			else if (hours == 12)
				printf("12:%02d p.m.\n", minutes);
			else if (hours > 12)
				printf("%d:%02d p.m.\n", hours % 12, minutes);
		}
	}
	return 0;
}

6.1 約瑟夫問題

#include <cstdio>

typedef struct Monkey {
	int data;
	struct Monkey *next;
}monkey, *linklist;

int main() {
	while (1) {
		linklist Head;
		Head = new Monkey;
		Head->next = NULL;
		linklist Tail;
		Tail = Head;
		int num, k;
		scanf("%d %d", &num, &k);
		if (num == 0 && k == 0)
			break;
		if (k == 1)
			printf("%d\n", num);
		else {
			for (int i = 1; i <= num; i++) {
				linklist temp;
				temp = new Monkey;
				temp->data = i;
				temp->next = NULL;
				Tail->next = temp;
				Tail = temp;
			}
			Tail->next = Head->next;
			delete Head;
			linklist L = Tail->next;
			while (L->next != L) {
				for (int i = 1; i < k - 1; i++)
					L = L->next;
				linklist temp = L->next;
				L->next = temp->next;
				delete temp;
				L = L->next;
			}
			printf("%d\n", L->data);
		}
	}
	return 0;
}

6.2 花生問題
#未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章