zoukankan      html  css  js  c++  java
  • 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
    ");
    34     }else {
    35         printf("STAY
    ");
    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("
    ");
    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
    ", 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
    ", 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 }
  • 相关阅读:
    使用者自订控件 / User Control
    File 与 Log #1ASP.NET的档案与I/O Stream(为系统记录Log文件)
    JavaScript + ASP.NET
    [VB][ASP.NET]FileUpload控件「批次上传 / 多档案同时上传」的范例
    Android开发之道(4)程序框架基础
    虚拟机网络设置
    POST 模拟登陆
    android 面试二
    SSCANF 正则表达式
    android 之 @ 与? 的区别
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140813.html
Copyright © 2011-2022 走看看