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 花生問題
#未完待續