• Codeforces Round #315 (Div. 2)


    这次可以说是最糟糕的一次比赛了吧, 心没有静下来好好的去思考, 导致没有做好能做的题。

    Problem_A:

    题意:

      你要听一首时长为T秒的歌曲, 你点击播放时会立刻下载好S秒, 当你听到没有加载到的地方时, 就会重头听, 直到可以听完整首歌,

      由于网络堵塞, 你在q秒内只有q-1秒用于下载, 问需要重新多少次, 第一次点击播放也算。

    思路:

      由题意可知, 下载速度为(q - 1) / q , 假设t秒后听歌的进度和下载的进度一样, 即听到没有下载的地方or已经下载完。

      可以得到方程:

              (q - 1) / q * t + s = t

              化简得:t / q = (t - s) / (q - 1)

              求解得:t = q * s

      即此时进度为t, 当t >= T时, 即下载完, 模拟即可。

    代码:

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <ctime>
     6 #include <set>
     7 #include <map>
     8 #include <list>
     9 #include <queue>
    10 #include <string>
    11 #include <vector>
    12 #include <fstream>
    13 #include <iterator>
    14 #include <iostream>
    15 #include <algorithm>
    16 using namespace std;
    17 #define LL long long
    18 #define INF 0x3f3f3f3f
    19 #define MOD 1000000007
    20 #define eps 1e-6
    21 #define MAXN 1000000
    22 #define MAXM 100
    23 #define dd cout<<"debug"<<endl
    24 #define p(x) printf("%d
    ", x)
    25 #define pd(x) printf("%.7lf
    ", x)
    26 #define k(x) printf("Case %d: ", ++x)
    27 #define s(x) scanf("%d", &x)
    28 #define sd(x) scanf("%lf", &x)
    29 #define mes(x, d) memset(x, d, sizeof(x))
    30 #define do(i, x) for(i = 0; i < x; i ++)
    31 #define dod(i, x, l) for(i = x; i >= l; i --)
    32 #define doe(i, x) for(i = 1; i <= x; i ++)
    33 int T, S, q;
    34 
    35 int main()
    36 {
    37     scanf("%d %d %d", &T, &S, &q);
    38     int ans = 0;
    39     while(S < T)
    40     {
    41         S *= q;
    42         ans ++;
    43     }
    44     printf("%d
    ", ans);
    45     return 0;
    46 }
    View Code

    Problem_B:

    题意:

      给一个数n, 再给n个数a[i],a[i]中会有重复 或者大于n的数。

      要求你给出一个1~n的排列。

    思路:

      求一个排列, 那么将不符合的数用符合的数代替即可。

      将a[i]中大于n 和 小于等于n 且重复的数的编号index记录下来

      然后用1~n中没有出现过的数替换掉即可。

    代码:

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <ctime>
     6 #include <set>
     7 #include <map>
     8 #include <list>
     9 #include <queue>
    10 #include <string>
    11 #include <vector>
    12 #include <fstream>
    13 #include <iterator>
    14 #include <iostream>
    15 #include <algorithm>
    16 using namespace std;
    17 #define LL long long
    18 #define INF 0x3f3f3f3f
    19 #define MOD 1000000007
    20 #define eps 1e-6
    21 #define MAXN 100010
    22 #define MAXM 100
    23 #define dd cout<<"debug"<<endl
    24 #define p(x) printf("%d
    ", x)
    25 #define pd(x) printf("%.7lf
    ", x)
    26 #define k(x) printf("Case %d: ", ++x)
    27 #define s(x) scanf("%d", &x)
    28 #define sd(x) scanf("%lf", &x)
    29 #define mes(x, d) memset(x, d, sizeof(x))
    30 #define do(i, x) for(i = 0; i < x; i ++)
    31 #define dod(i, x, l) for(i = x; i >= l; i --)
    32 #define doe(i, x) for(i = 1; i <= x; i ++)
    33 int n;
    34 int a[MAXN];
    35 int ans[MAXN];
    36 int ord[MAXN];
    37 bool vis[MAXN];
    38 
    39 int main()
    40 {
    41     int x;
    42     int cnt, t;
    43     scanf("%d", &n);
    44     cnt = 0;
    45     t = 0;
    46     mes(ans, 0);
    47     mes(ord, 0);
    48     mes(vis, false);
    49     for(int i = 0; i < n; i ++)
    50     {
    51         scanf("%d", &a[i]);
    52         if(vis[a[i]] || a[i] > n) ord[cnt ++] = i;
    53         else if(!vis[a[i]])
    54             vis[a[i]] = true;
    55     }
    56     int k1 = 0;
    57     for(int i = 1; i <= n; i ++)
    58         if(!vis[i]) a[ord[k1 ++]] = i;
    59     for(int i = 0; i < n; i ++)
    60         printf("%d ", a[i]);
    61     printf("
    ");
    62     return 0;
    63 }
    View Code

    Problem_C:

    题意:

      给两个数, p, q。 求满足π(n) ≤ A * rad(n) 的n 的最大取值。

      π(n)是小于等于n的素数个数, rad(n)是小于等于n的回文数的个数, A = p / q。

    思路:

      首先, 回文数比较少,200w以内也只有2998个, 而 A 最大为42, 2998 * 42 = 125916

      而200W以内的素数有148933个 > 125916, 而越往上, n越大, 素数越来越多, 而且增长幅度大于回文数, 所以, 最大数只能是在200W以内寻找。

      将所有的素数和回文数预处理出来, 然后循环寻找最大的n, 复杂度为O(2 * 10 ^ 5), q可以乘过去, 避免处理浮点数。

    代码:

      

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <ctime>
     6 #include <set>
     7 #include <map>
     8 #include <list>
     9 #include <queue>
    10 #include <string>
    11 #include <vector>
    12 #include <fstream>
    13 #include <iterator>
    14 #include <iostream>
    15 #include <algorithm>
    16 using namespace std;
    17 #define LL long long
    18 #define INF 0x3f3f3f3f
    19 #define MOD 1000000007
    20 #define eps 1e-6
    21 #define MAXN 2000000
    22 #define MAXM 100
    23 #define dd cout<<"debug"<<endl
    24 #define p(x) printf("%d
    ", x)
    25 #define pd(x) printf("%.7lf
    ", x)
    26 #define pa {system("pause");}
    27 #define k(x) printf("Case %d: ", ++x)
    28 #define s(x) scanf("%d", &x)
    29 #define sd(x) scanf("%lf", &x)
    30 #define mes(x, d) memset(x, d, sizeof(x))
    31 #define do(i, x) for(i = 0; i < x; i ++)
    32 #define dod(i, x, l) for(i = x; i >= l; i --)
    33 #define doe(i, x) for(i = 1; i <= x; i ++)
    34 bool prime[MAXN];
    35 int pm[MAXN];
    36 int rm[MAXN];
    37 int p, q;
    38 bool is_ok(int n);
    39 void init()
    40 {
    41     prime[0] = prime[1] = false;
    42     prime[2] = true;
    43     for(int i = 3; i <MAXN; i ++)
    44         prime[i] = (i % 2 == 0? false : true);
    45     int t = (int)sqrt(MAXN * 1.0);
    46     for(int i = 3; i <= t; i ++)
    47         if(prime[i])
    48             for(int j = i + i; j < MAXN; j += i)
    49                 prime[j] = false;
    50     for(int i = 1; i < MAXN; i ++)
    51     {
    52         pm[i] = pm[i -1] + (prime[i]? 1 : 0);
    53         rm[i] = rm[i -1] + (is_ok(i)? 1: 0);
    54     }
    55 }
    56 bool is_ok(int n)
    57 {
    58     int m = n;
    59     int s = 0;
    60     while(m)
    61     {
    62         s = s * 10 + m % 10;
    63         m /= 10;
    64     }
    65     if(s == n)
    66         return true;
    67     return false;
    68 }
    69 
    70 int main()
    71 {
    72     init();
    73     while(scanf("%d %d", &p, &q) != EOF)
    74     {
    75         int ans = 1;
    76         for(int i = 1; i < MAXN; i ++)
    77             if(q * pm[i] <= p * rm[i]) ans = i;
    78         p(ans);
    79     }
    80     return 0;
    81 }
    View Code

      

  • 相关阅读:
    异常以及异常处理框架探析
    ArcGis Server10 for java初试
    C#制作鹰眼全过程(带注释)
    flex remoteobject 因默认设置而调用失败
    ExecutorService.submit(Callable).get()不并发执行
    学习《The Flex, Spring, and BlazeDS full stack》-1
    java.lang.NoSuchMethodError: org.hibernate.mapping.SimpleValue.<init>(Lorg/hibernate/mapping/Table;)V
    用内置jetty运行项目struts2提示找不到Action
    二分查找
    排序
  • 原文地址:https://www.cnblogs.com/By-ruoyu/p/4719866.html
Copyright © 2020-2023  润新知