Your Ride Is Here:模拟一下题意过程,就可以了。。。
1 /* 2 ID: Jming 3 PROG: ride 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 #include <cstdio> 9 #include <string> 10 using namespace std; 11 12 int Solve(string str) 13 { 14 int sum = 1; 15 for (int i = 0; i < str.size(); i++) { 16 sum *= (str[i] - 'A' + 1); 17 sum %= 47; 18 } 19 return sum; 20 } 21 22 int main() 23 { 24 freopen("ride.in", "r", stdin); 25 freopen("ride.out", "w", stdout); 26 string str; 27 string str1; 28 cin >> str >> str1; 29 int tmp1, tmp2; 30 tmp1 = Solve(str); 31 tmp2 = Solve(str1); 32 if (tmp1 == tmp2) { 33 printf("GO\n"); 34 }else { 35 printf("STAY\n"); 36 } 37 return 0; 38 }
Greedy Gift Givers:用map即可解决。。。
1 /* 2 ID: Jming 3 PROG: gift1 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 #include <cstdio> 9 #include <string> 10 #include <map> 11 using namespace std; 12 const int MAX_N = 15; 13 string arr_str[MAX_N]; 14 15 int N; 16 17 struct node { 18 int rec, giv; 19 node() { 20 rec = 0; 21 giv = 0; 22 } 23 }; 24 node myrecord[MAX_N]; 25 map<string, node> str_no_map; 26 27 void Solve() { 28 string str, t_str; 29 int amount, number; 30 while (cin >> str) { 31 scanf("%d %d", &amount, &number); 32 if (0 == number) { 33 continue; 34 } 35 str_no_map[str].giv += (amount / number) * number; 36 for (int i = 0; i < number; ++i) { 37 cin >> t_str; 38 str_no_map[t_str].rec += (amount / number); 39 } 40 } 41 for (int i = 0; i < N; ++i) { 42 cout << arr_str[i] << " " << str_no_map[arr_str[i]].rec - str_no_map[arr_str[i]].giv << endl; 43 } 44 } 45 46 int main() 47 { 48 freopen("gift1.in", "r", stdin); 49 freopen("gift1.out", "w", stdout); 50 scanf("%d", &N); 51 for (int i = 0; i < N; ++i) { 52 cin >> arr_str[i]; 53 str_no_map[arr_str[i]] = myrecord[i]; 54 } 55 Solve(); 56 return 0; 57 }
Friday the Thirteenth:数学知识就可解决。。。
1 /* 2 ID: Jming 3 PROG: friday 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 #include <cstdio> 9 using namespace std; 10 int N, cnt[13] = { 0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 11 int ans[7]; 12 13 void Solve() { 14 int end_year = 1900+N; 15 int days, week = 1; 16 for (int i = 1900; i < end_year; ++i) { 17 for (int j = 1; j <= 12; ++j) { 18 if (2 == j) { 19 if (!(i%100)) { 20 if (!(i%400)) { days = 29; } 21 else { days = 28; } 22 }else { 23 if (!(i%4)) { days = 29; } 24 else { days = 28; } 25 } 26 }else { days = cnt[j]; } 27 ans[(week+5)%7]++; 28 week = (week+days%7)%7; 29 } 30 } 31 printf("%d ", ans[6]); 32 for (int i = 0; i < 6; ++i) { 33 printf("%d", ans[i]); 34 if (i != 5) { 35 printf(" "); 36 } 37 } 38 printf("\n"); 39 } 40 41 int main() 42 { 43 freopen("friday.in", "r", stdin); 44 freopen("friday.out", "w", stdout); 45 scanf("%d", &N); 46 Solve(); 47 return 0; 48 }
Broken Necklace:
由于(3<=N<=350),故以O(n^2)复杂度解决也可AC。。。不过,AC后看到给的分析里有一种O(n)的方法也学了一下。
O(n^2):
1 /* 2 ID: Jming 3 PROG: beads 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 #include <cstdio> 9 #include <string> 10 #include <algorithm> 11 using namespace std; 12 int N; 13 string str; 14 15 void Solve() { 16 int sum1, sum2; 17 int ans = -1; 18 for (int i = 0; i < N; ++i) { 19 char ch; 20 sum1 = 1; 21 if ('w' == str[i]) { 22 for (int j = i+1; j != i; j = (j+1)%N) { 23 if ('w' != str[j]) { 24 ch = str[j]; 25 break; 26 } 27 } 28 }else { ch = str[i]; } 29 30 int r = (i + 1)%N; 31 while (r != i) { 32 if (('w' == str[r]) || (str[i] == str[r])) { 33 ++sum1; 34 r = (r+1)%N; 35 } 36 else break; 37 } 38 r = (r-1 + N)%N; 39 40 int l = (i-1+N)%N; 41 42 int sum2 = 0; 43 if (l != r) { 44 if ('w' == str[l]) { 45 for (int j = l; j != r; j = (j-1+N)%N) { 46 if ('w' != str[j]) { 47 ch = str[j]; 48 break; 49 } 50 } 51 }else { ch = str[l]; } 52 } 53 while (l != r) { 54 if (('w' == str[l]) || (ch == str[l])) { 55 ++sum2; 56 l = (l-1+N)%N; 57 } 58 else break; 59 } 60 ans = max(ans, sum1+sum2); 61 } 62 printf("%d\n", ans); 63 } 64 65 int main() 66 { 67 freopen("beads.in", "r", stdin); 68 freopen("beads.out", "w", stdout); 69 scanf("%d", &N); 70 cin >> str; 71 Solve(); 72 return 0; 73 }
O(n):
关键:
(1)将环转换为所给串重复的两个(即str+str)
(2)作预处理,myleft[pos][ ],表示在字符串pos位置之前(不包括pos位置的字符),连续的相同颜色的珠子数
myright[pos][ ],表示从字符串pos位置向右(包括pos位置的字符),连续的相同颜色的珠子数
1 /* 2 ID: Jming 3 PROG: beads 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 #include <cstdio> 9 #include <string> 10 using namespace std; 11 #define MAX(a, b) ((a)>(b)?(a):(b)) 12 #define MIN(a, b) ((a)<(b)?(a):(b)) 13 14 int N; 15 string str; 16 const int MAX_N = 705; 17 int myleft[MAX_N][2], myright[MAX_N][2]; 18 19 void Solve() { 20 // 0: b 1:r 21 myleft[0][0] = myleft[0][1] = 0; 22 for (int i = 1; i <= N; ++i) { 23 if ('b' == str[i-1]) { 24 myleft[i][0] = myleft[i-1][0] + 1; 25 myleft[i][1] = 0; 26 } 27 else if ('r' == str[i-1]) { 28 myleft[i][1] = myleft[i-1][1] + 1; 29 myleft[i][0] = 0; 30 } 31 else { 32 myleft[i][0] = myleft[i-1][0] + 1; 33 myleft[i][1] = myleft[i-1][1] + 1; 34 } 35 } 36 37 myright[N][0] = myright[N][1] = 0; 38 for (int i = N-1; i >= 0; --i) { 39 if ('b' == str[i]) { 40 myright[i][0] = myright[i+1][0] + 1; 41 myright[i][1] = 0; 42 }else if ('r' == str[i]) { 43 myright[i][1] = myright[i+1][1] + 1; 44 myright[i][0] = 0; 45 }else { 46 myright[i][0] = myright[i+1][0] + 1; 47 myright[i][1] = myright[i+1][1] + 1; 48 } 49 } 50 int ans = 0; 51 for (int i = 0; i < N; ++i) { 52 ans = MAX(ans, MAX(myleft[i][0], myleft[i][1])+ MAX(myright[i][0], myright[i][1])); 53 } 54 ans = MIN(ans, N>>1); 55 printf("%d\n", ans); 56 } 57 58 int main() 59 { 60 freopen("beads.in", "r", stdin); 61 freopen("beads.out", "w", stdout); 62 scanf("%d", &N); 63 cin >> str; 64 str = str+str; 65 N = N<<1; 66 Solve(); 67 return 0; 68 }