USACO 之 Section 1.1 Ad Hoc Problems (已解决)

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 }

 

posted @ 2014-07-28 20:18  JmingS  阅读(218)  评论(0编辑  收藏  举报