zoukankan      html  css  js  c++  java
  • Codeforces Round #326 div2

    Problem_A(588A):

    题意:

      Duff 很喜欢吃肉, 每天都要吃,然而她又懒得下楼。 可以买很多放在家里慢慢吃。然而肉价每天都在变化,现给定一个n, 表示有多少天,然后第i天吃ai kg的肉, 当天的价格为pi。

      问满足Duff的要求, 最少需要多少钱。

    思路:

      稍稍分析, 可以得知, 应该维护一个最小价格。然后按照最小价格去买那一段区间的肉。

    代码:

      

     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 <stack>
    10 #include <queue>
    11 #include <string>
    12 #include <vector>
    13 #include <fstream>
    14 #include <iterator>
    15 #include <iostream>
    16 #include <algorithm>
    17 using namespace std;
    18 #define LL long long
    19 #define INF 0x3f3f3f3f
    20 #define MOD 1000000007
    21 #define eps 1e-6
    22 #define MAXN 1000000
    23 #define MAXM 100
    24 #define dd {cout<<"debug"<<endl;}
    25 #define pa {system("pause");}
    26 #define p(x) {printf("%d
    ", x);}
    27 #define pd(x) {printf("%.7lf
    ", x);}
    28 #define k(x) {printf("Case %d: ", ++x);}
    29 #define s(x) {scanf("%d", &x);}
    30 #define sd(x) {scanf("%lf", &x);}
    31 #define mes(x, d) {memset(x, d, sizeof(x));}
    32 #define do(i, x) for(i = 0; i < x; i ++)
    33 #define dod(i, x, l) for(i = x; i >= l; i --)
    34 #define doe(i, x) for(i = 1; i <= x; i ++)
    35 int n;
    36 int a, p;
    37 
    38 int main()
    39 {
    40     scanf("%d", &n);
    41     int sum = 0, min_p = INF, num = 0;
    42     for(int i = 0; i < n; i ++)
    43     {
    44         scanf("%d %d", &a, &p);
    45         if(p < min_p)
    46         {
    47             sum = sum + num * min_p;
    48             min_p = p;
    49             num = a;
    50         }
    51         else 
    52             num += a;
    53     }
    54     if(num) sum = sum + num * min_p;
    55     printf("%d
    ", sum);
    56     return 0;
    57 }
    View Code

    Problem_B(588B):

    题意:

      给一个数n, 在它所有的约数里(包括1和它自身), 找到这样一个最大的数:不能被某个数的平方整除。例如:8能被4整除, 而4是2的平方 所以不行。

    思路:

      任何一个数, 都能将其写成质因子分解的形式,从质因子分解式就能看出一个规律, 如果把所有的质因子全部乘起来恰好是满足题意的最大的数。 如果幂超过1, 则只算一个。

      因为再多乘任何一个数, 得到的都会是某个平方的倍数(嗯哼, 你多乘的那个质因子)。 So, 答案就出来了。

      由于对称的性质, 10^12, 只需要打10^6的素数表就OK了。

    代码:

      

     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 <stack>
    10 #include <queue>
    11 #include <string>
    12 #include <vector>
    13 #include <fstream>
    14 #include <iterator>
    15 #include <iostream>
    16 #include <algorithm>
    17 using namespace std;
    18 #define LL long long
    19 #define INF 0x3f3f3f3f
    20 #define MOD 1000000007
    21 #define eps 1e-6
    22 #define MAXN 10000010
    23 #define MAXM 1000010
    24 #define dd {cout<<"debug"<<endl;}
    25 #define pa {system("pause");}
    26 #define p(x) {printf("%d
    ", x);}
    27 #define pd(x) {printf("%.7lf
    ", x);}
    28 #define k(x) {printf("Case %d: ", ++x);}
    29 #define s(x) {scanf("%d", &x);}
    30 #define sd(x) {scanf("%lf", &x);}
    31 #define mes(x, d) {memset(x, d, sizeof(x));}
    32 #define do(i, x) for(i = 0; i < x; i ++)
    33 #define dod(i, x, l) for(i = x; i >= l; i --)
    34 #define doe(i, x) for(i = 1; i <= x; i ++)
    35 LL n;
    36 LL p[MAXN], cnt = 0;
    37 bool a[MAXN];
    38 
    39 void Prime2()
    40 {
    41     memset(a, 0, sizeof(a));
    42     int i, j;
    43     for (i = 2; i < MAXN; ++i)
    44     {
    45         if (!(a[i])) p[cnt ++] = i;
    46         for (j = 0; (j < cnt && i * p[j] < MAXN); ++j)
    47         {
    48             a[i * p[j]] = 1;
    49             if (!(i % p[j])) break;
    50         }
    51     }
    52 }
    53 
    54 LL get_ans(LL x)
    55 {
    56     LL ans = 1;
    57     for(int i = 0; i < cnt ; i ++)
    58     {
    59         if(x == 1) return ans;
    60         if(x % p[i] == 0)
    61         {
    62             x /= p[i];
    63             ans = ans * p[i];
    64             while(x % p[i] == 0)
    65                 x /= p[i];
    66         }
    67     }
    68     return ans * x;
    69 }
    70 
    71 
    72 int main()
    73 {
    74     Prime2();
    75     scanf("%I64d", &n);
    76     printf("%I64d
    ", get_ans(n));
    77     return 0;
    78 }
    View Code

    Problem_C(587A):

    题意:

      题意是给一个长度为n的序列, 其代表的含义是第i个表示 重量为2^w[i]的一个物品。

      而Duff 每次能举起这样一堆物品:这堆物品的和为2^x。

      求举完所有的物品所有的最小次数。

    思路:

      简单分析后能得到一个结论:两个一样的数能合成一个比它大一的数,so 答案就出来了。 排序后不停的往上合成就行了。

     

    代码:

      

     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 <stack>
    10 #include <queue>
    11 #include <string>
    12 #include <vector>
    13 #include <fstream>
    14 #include <iterator>
    15 #include <iostream>
    16 #include <algorithm>
    17 using namespace std;
    18 #define LL long long
    19 #define INF 0x3f3f3f3f
    20 #define MOD 1000000007
    21 #define eps 1e-6
    22 #define MAXN 1000100
    23 #define MAXM 100
    24 #define dd {cout<<"debug"<<endl;}
    25 #define pa {system("pause");}
    26 #define p(x) {printf("%d
    ", x);}
    27 #define pd(x) {printf("%.7lf
    ", x);}
    28 #define k(x) {printf("Case %d: ", ++x);}
    29 #define s(x) {scanf("%d", &x);}
    30 #define sd(x) {scanf("%lf", &x);}
    31 #define mes(x, d) {memset(x, d, sizeof(x));}
    32 #define do(i, x) for(i = 0; i < x; i ++)
    33 #define dod(i, x, l) for(i = x; i >= l; i --)
    34 #define doe(i, x) for(i = 1; i <= x; i ++)
    35 int n;
    36 int w[MAXN];
    37 
    38 int main()
    39 {
    40     int x, ans = 0;
    41     scanf("%d", &n);
    42     mes(w, 0);
    43     for(int i = 0; i < n; i ++)
    44     {
    45         scanf("%d", &x);
    46         w[x] ++;
    47     }
    48     for(int i = 0; i < MAXN; i ++)
    49         if(w[i])
    50         {
    51             w[i + 1] = w[i + 1] + w[i] / 2;
    52             if(w[i] % 2) ans ++;
    53         }
    54     printf("%d
    ", ans);
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    oracle里某列插入多行数据
    子类与父类的一些关系
    math.round()的值怎么取的
    oracle replace函数
    spring5.1.5使用的jackson依赖版本
    eclipse设置新建jsp页面的默认编码为utf-8
    c3p0启动失败
    sql的左联右联合内联的区别
    eclipse安装spring tools插件的问题
    HTML点击按钮button跳转页面的四种方法
  • 原文地址:https://www.cnblogs.com/By-ruoyu/p/5524609.html
Copyright © 2011-2022 走看看