zoukankan      html  css  js  c++  java
  • USACO 之 Section 1.5 (已解决)

    Number Triangles:

    /*

      DP 题

      dp[j] = max(dp[j - 1] + tgl[i-1][j], dp[j] + tgl[i-1][j]);

    */

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #define HOME
     3 #define _CRTDBG_MAP_ALLOC
     4 #include <crtdbg.h>
     5 
     6 /*
     7 ID: Jming
     8 PROG: numtri
     9 LANG: C++
    10 */
    11 #include <iostream>
    12 #include <fstream>
    13 #include <sstream>
    14 #include <cstdlib>
    15 #include <cstdio>
    16 #include <cstddef>
    17 #include <iterator>
    18 #include <algorithm>
    19 #include <string>
    20 #include <locale>
    21 #include <cmath>
    22 #include <vector>
    23 #include <cstring>
    24 #include <map>
    25 #include <utility>
    26 #include <queue>
    27 #include <stack>
    28 #include <set>
    29 #include <functional>
    30 using namespace std;
    31 typedef pair<int, int> PII;
    32 typedef long long int64;
    33 const int INF = 0x3f3f3f3f;
    34 const int modPrime = 3046721;
    35 const double eps = 1e-9;
    36 const int MaxN = 510000;
    37 const int MaxM = 10010;
    38 
    39 
    40 int N;
    41 int dp[MaxN];
    42 vector<vector<int> > tgl;
    43 
    44 
    45 void Solve()
    46 {
    47     for (int i = 1; i <= N; ++i)
    48     {
    49         for (int j = i; j >= 1; --j)
    50         {
    51             dp[j] = max(dp[j - 1] + tgl[i-1][j], dp[j] + tgl[i-1][j]);
    52         }
    53     }
    54     cout << *max_element(dp, dp + MaxN) << endl;
    55 }
    56 
    57 int main()
    58 {
    59 #ifdef HOME
    60     freopen("in", "r", stdin);
    61     //freopen("out", "w", stdout);
    62 #endif
    63 
    64     freopen("numtri.in", "r", stdin);
    65     freopen("numtri.out", "w", stdout);
    66 
    67     fill(dp, dp + MaxN, 0);
    68     scanf("%d", &N);
    69     for (int i = 1; i <= N; ++i)
    70     {
    71         vector<int> row;
    72         row.push_back(0);
    73         int tmp;
    74         for (int j = 0; j < i; ++j)
    75         {
    76             scanf("%d", &tmp);
    77             row.push_back(tmp);
    78         }
    79         tgl.push_back(row);
    80     }
    81 
    82     Solve();
    83 
    84 #ifdef HOME
    85     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    86     _CrtDumpMemoryLeaks();
    87 #endif
    88     return 0;
    89 }

    Prime Palindromes:

    /*
      生成回文数 + 判断是否为质数
    */

    解法一:

      1 /*
      2 ID: Jming
      3 PROG: pprime
      4 LANG: C++
      5 */
      6 #include <iostream>
      7 #include <fstream>
      8 #include <sstream>
      9 #include <cstdlib>
     10 #include <cstdio>
     11 #include <cstddef>
     12 #include <iterator>
     13 #include <algorithm>
     14 #include <string>
     15 #include <locale>
     16 #include <cmath>
     17 #include <vector>
     18 #include <cstring>
     19 #include <map>
     20 #include <utility>
     21 #include <queue>
     22 #include <stack>
     23 #include <set>
     24 #include <functional>
     25 using namespace std;
     26 typedef pair<int, int> PII;
     27 typedef long long int64;
     28 const int INF = 0x3f3f3f3f;
     29 const int modPrime = 3046721;
     30 const double eps = 1e-9;
     31 const int MaxN = 100000010;
     32 const int MaxM = 10010;
     33 
     34 
     35 vector<int> legal;
     36 
     37 
     38 // 判断是否为质数
     39 bool isPrime(int x)
     40 {
     41     for (int i = 2; i*i <= x; ++i)
     42     {
     43         if (x%i == 0)
     44         {
     45             return false;
     46         }
     47     }
     48     return true;
     49 }
     50 
     51 // 保存答案
     52 void getAns(int x)
     53 {
     54     if (isPrime(x))
     55     {
     56         legal.push_back(x);
     57     }
     58 }
     59 
     60 // 生成回文数
     61 void getPdm()
     62 {
     63     int palindrome;
     64 
     65     for (int i1 = 1; i1 <= 9; i1 += 2)
     66     {
     67         // 1
     68         palindrome = i1;
     69         getAns(palindrome);
     70         // 2
     71         palindrome = i1 * 10 + i1;
     72         getAns(palindrome);
     73     }
     74 
     75     for (int i1 = 1; i1 <= 9; i1 += 2)
     76     {
     77         for (int i2 = 0; i2 <= 9; ++i2)
     78         {
     79             // 3
     80             palindrome = i1 * 100 + i2 * 10 + i1;
     81             getAns(palindrome);
     82             // 4
     83             palindrome = i1 * 1000 + i2 * 100 + i2 * 10 + i1;
     84             getAns(palindrome);
     85         }
     86     }
     87 
     88     for (int i1 = 1; i1 <= 9; i1 += 2)
     89     {
     90         for (int i2 = 0; i2 <= 9; ++i2)
     91         {
     92             for (int i3 = 0; i3 <= 9; ++i3)
     93             {
     94                 // 5
     95                 palindrome =
     96                     i1 * 10000 + i2 * 1000 + i3 * 100 +
     97                     i2 * 10 + i1;
     98                 getAns(palindrome);
     99                 // 6
    100                 palindrome =
    101                     i1 * 100000 + i2 * 10000 + i3 * 1000 +
    102                     i3 * 100 + i2 * 10 + i1;
    103                 getAns(palindrome);
    104             }
    105         }
    106     }
    107 
    108     for (int i1 = 1; i1 <= 9; i1 += 2)
    109     {
    110         for (int i2 = 0; i2 <= 9; ++i2)
    111         {
    112             for (int i3 = 0; i3 <= 9; ++i3)
    113             {
    114                 for (int i4 = 0; i4 <= 9; ++i4)
    115                 {
    116                     // 7
    117                     palindrome =
    118                         i1 * 1000000 + i2 * 100000 + i3 * 10000 + i4 * 1000 +
    119                         i3 * 100 + i2 * 10 + i1;
    120                     getAns(palindrome);
    121                     // 8
    122                     palindrome =
    123                         i1 * 10000000 + i2 * 1000000 + i3 * 100000 + i4 * 10000 +
    124                         i4 * 1000 + i3 * 100 + i2 * 10 + i1;
    125                     getAns(palindrome);
    126                 }
    127             }
    128         }
    129     }
    130 }
    131 
    132 
    133 
    134 int main()
    135 {
    136 #ifdef HOME
    137     freopen("in", "r", stdin);
    138     //freopen("out", "w", stdout);
    139 #endif
    140 
    141     freopen("pprime.in", "r", stdin);
    142     freopen("pprime.out", "w", stdout);
    143 
    144     
    145 
    146     getPdm();
    147     sort(legal.begin(), legal.end());
    148     int a, b;
    149     scanf("%d %d", &a, &b);
    150     int i = 0;
    151     while (legal[i] < a) ++i;
    152     while ((i<legal.size()) && legal[i] <= b)
    153     {
    154         printf("%d
    ", legal[i]);
    155         ++i;
    156     }
    157 
    158 
    159 
    160 #ifdef HOME
    161     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    162     _CrtDumpMemoryLeaks();
    163 #endif
    164     return 0;
    165 }

    解法二(优化):

      1 /*
      2      生成回文数 + 判断是否为质数
      3 备注:
      4     sprintf:整数转换为字符串
      5     atoi:字符串转换为int
      6 */
      7 /*
      8 ID: Jming
      9 PROG: pprime
     10 LANG: C++
     11 */
     12 #include <iostream>
     13 #include <fstream>
     14 #include <sstream>
     15 #include <cstdlib>
     16 #include <cstdio>
     17 #include <cstddef>
     18 #include <iterator>
     19 #include <algorithm>
     20 #include <string>
     21 #include <locale>
     22 #include <cmath>
     23 #include <vector>
     24 #include <cstring>
     25 #include <map>
     26 #include <utility>
     27 #include <queue>
     28 #include <stack>
     29 #include <set>
     30 #include <functional>
     31 using namespace std;
     32 typedef pair<int, int> PII;
     33 typedef long long int64;
     34 const int INF = 0x3f3f3f3f;
     35 const int modPrime = 3046721;
     36 const double eps = 1e-9;
     37 const int MaxN = 10010;
     38 const int MaxM = 10010;
     39 
     40 
     41 int A, B;
     42 
     43 // 判断是否为质数
     44 bool isPrime(int x)
     45 {
     46     if (x < 2)
     47     {
     48         return false;
     49     }
     50     for (int i = 2; i*i <= x; ++i)
     51     {
     52         if (x%i == 0)
     53         {
     54             return false;
     55         }
     56     }
     57     return true;
     58 }
     59 
     60 void gen(int x, int isOdd)
     61 {
     62     char buf[10];
     63 
     64     sprintf(buf, "%d", x);
     65 
     66     char *p, *q;
     67 
     68     p = buf + strlen(buf);
     69     
     70     q = p - isOdd;
     71 
     72     while (q > buf)
     73     {
     74         *(p++) = *(--q);
     75     }
     76 
     77     *p = '';
     78 
     79     int n = atoi(buf);
     80 
     81     if ((n >= A) && (n <= B) && (isPrime(n)))
     82     {
     83         printf("%d
    ", n);
     84     }
     85 }
     86 
     87 
     88 
     89 void getPdm(int start, int end)
     90 {
     91     for (int i = start; i <= end; ++i)
     92     {
     93         // 生成位数是奇数的回文数
     94         gen(i, 1);
     95     }
     96     for (int i = start; i <= end; ++i)
     97     {
     98         // 生成位数是偶数的回文数
     99         gen(i, 0);
    100     }
    101 }
    102 
    103 void Solve()
    104 {
    105     getPdm(1, 9);
    106     getPdm(10, 99);
    107     getPdm(100, 999);
    108     getPdm(1000, 9999);
    109 }
    110 
    111 int main()
    112 {
    113 #ifdef HOME
    114     freopen("in", "r", stdin);
    115     //freopen("out", "w", stdout);
    116 #endif
    117 
    118     freopen("pprime.in", "r", stdin);
    119     freopen("pprime.out", "w", stdout);
    120 
    121     scanf("%d %d", &A, &B);
    122     Solve();
    123 
    124 
    125 #ifdef HOME
    126     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    127     _CrtDumpMemoryLeaks();
    128 #endif
    129     return 0;
    130 }

    Superprime Rib:

    /*

      此题可利用 “当前生成位数为n的数是否为质数” 进行剪枝

      递归,详见代码
    */

     1 /*
     2 ID: Jming
     3 PROG: sprime
     4 LANG: C++
     5 */
     6 #include <iostream>
     7 #include <fstream>
     8 #include <sstream>
     9 #include <cstdlib>
    10 #include <cstdio>
    11 #include <cstddef>
    12 #include <iterator>
    13 #include <algorithm>
    14 #include <string>
    15 #include <locale>
    16 #include <cmath>
    17 #include <vector>
    18 #include <cstring>
    19 #include <map>
    20 #include <utility>
    21 #include <queue>
    22 #include <stack>
    23 #include <set>
    24 #include <functional>
    25 using namespace std;
    26 typedef pair<int, int> PII;
    27 typedef long long int64;
    28 const int INF = 0x3f3f3f3f;
    29 const int modPrime = 3046721;
    30 const double eps = 1e-9;
    31 const int MaxN = 10010;
    32 const int MaxM = 10010;
    33 
    34 int N;
    35 
    36 bool isPrime(int x)
    37 {
    38     if (x < 2)
    39     {
    40         return false;
    41     }
    42     for (int i = 2; i*i <= x; ++i)
    43     {
    44         if (x%i == 0)
    45         {
    46             return false;
    47         }
    48     }
    49     return true;
    50 }
    51 
    52 
    53 void Solve(int val, int n)
    54 {
    55     if (n == N)
    56     {
    57         printf("%d
    ", val);
    58         return;
    59     }
    60     for (int i = 1; i <= 9; ++i)
    61     {
    62         int tmp = val * 10 + i;
    63         // 剪枝
    64         if (isPrime(tmp))
    65         {
    66             Solve(tmp, n + 1);
    67         }
    68     }
    69 }
    70 
    71 int main()
    72 {
    73 #ifdef HOME
    74     //freopen("in", "r", stdin);
    75     //freopen("out", "w", stdout);
    76 #endif
    77 
    78     freopen("sprime.in", "r", stdin);
    79     freopen("sprime.out", "w", stdout);
    80 
    81     while (~scanf("%d", &N))
    82     {
    83         Solve(0, 0);
    84     }
    85 
    86 #ifdef HOME
    87     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    88     _CrtDumpMemoryLeaks();
    89 #endif
    90     return 0;
    91 }
  • 相关阅读:
    win7下安装Linux实现双系统全攻略
    Dreamweaver_CS6安装与破解,手把手教程
    windows Server 2008各版本有何区别?
    如何查看路由器中的pppoe拨号密码?
    xp远程桌面连接最大用户数怎么设置?
    网站的盈利模式
    linux 下安装mysql-5.7.16
    GNS3连接虚拟机
    cain使用教程
    数据中心网络架构的问题与演进 — CLOS 网络与 Fat-Tree、Spine-Leaf 架构
  • 原文地址:https://www.cnblogs.com/shijianming/p/5248299.html
Copyright © 2011-2022 走看看