• Codeforces Round #326(Div2)


    CodeForces 588A

     题意:Duff喜欢吃肉,想在接下来的n天,每天都有Ai斤肉吃,但每一天肉的单价Pi不定,可以保存不过期,现已知n天每天肉的斤数Ai,以及单价Pi,为了使每天都             有想要的Ai斤肉吃,求最小花费。

     思路:cost=Ai*min(pi)  1<=i<=n;

     代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 const int maxn=1e5+5;
     6 const int inf=0x3f3f3f3f;
     7 int cost[maxn],p[maxn];
     8 
     9 int main()
    10 {
    11     int d,minn,res;
    12     while(~scanf("%d",&d))
    13     {
    14         res=0;minn=inf;
    15         for(int i=0;i<d;i++)
    16         {
    17             scanf("%d%d",&cost[i],&p[i]);
    18             if(p[i]<minn)
    19                 minn=p[i];
    20             res+=cost[i]*minn;
    21         }    
    22         printf("%d
    ",res);
    23     }
    24     return 0;
    25 }
    View Code

    CodeForces 588B

    题意:有一个数n,有多个因子,例如12={1,2,4,6,12},满足可爱数的条件是:为n的因子,并且这个数的因子数不能被开方。现求最大可爱数。

    思路:数据较大1e12.

             方案一、暴力+用sqrt减少循环次数。使时间复杂度达到根号n*根号根号n,即1e9.

             方案二、打一个素数表,整数可以拆分成任意素数的乘积。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 using namespace std;
     6 long long n;
     7 
     8 bool deal(long long x)
     9 {
    10     long long y=sqrt(x)+1;
    11     for(long long i=2;i<=y;i++)
    12         if(x%(i*i)==0)
    13             return 0;
    14     return 1;
    15 }
    16 
    17 int main()
    18 {
    19     while(~scanf("%lld",&n))
    20     {
    21         long long m=sqrt(n);int flag=0;
    22         long long res;
    23         for(long long i=1;i<=m+1;i++)
    24         {
    25             if(n%i==0&&deal(n/i))
    26             {
    27                 flag=1;
    28                 res=n/i;
    29                 break;    
    30             }    
    31         }
    32         if(!flag)
    33         {
    34             for(long long i=m;i>=1;i--)
    35             {
    36                 if(n%i==0&&deal(i))
    37                 {
    38                     res=i;
    39                     break;
    40                 }
    41             }
    42         }
    43         printf("%lld
    ", res);
    44     }
    45     return 0;
    46 }
    View Code

    CodeForces 587A

    题意:n个数,A1,A2.....An。选k(k<=n)个数,构成2^a1+2^a2+...2^ak=2^x(可为任意),算一次,一个数只能被选一次。求数全被选完最少需要多少次。

    思路:可发现:2^2=2^1+2^1

                       2^3=2^2+2^2

                       2^4=2^3+2^3

                       ......

                       2^n=2^(n-1)+2^(n-1)

            由于n个数任意取,并且2^n=2^(n-1)+2^(n-1).   只看指数,即Ai,(1,1)=2,  (2,2)=3,    (n-1,n-1)=n

            为了尽少次数的到底2^x.    需要统计Ai的个数。然后(1,1)=2,  (2,2)=3,    (n-1,n-1)=n,

           一 直合成到最大。合成后剩下的次数即为result.

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn=1e6+20;
     7 
     8 int f[2*maxn],a[maxn];
     9 int n,res,maxx;
    10 
    11 void deal()
    12 {
    13     res=0;
    14     for(int i=0;i<=maxn;i++)
    15     {
    16         if(f[i]%2==1)
    17         {
    18             f[i+1]+=(f[i]-1)/2;
    19             res++;
    20         }    
    21         else
    22             f[i+1]+=f[i]/2;
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     while(~scanf("%d",&n))
    29     {
    30         memset(f,0,sizeof(f));
    31         maxx=-1;
    32         for(int i=0;i<n;i++)
    33         {
    34             scanf("%d",&a[i]);
    35             maxx=max(maxx,a[i]);
    36             f[a[i]]++;
    37         }    
    38         deal();
    39         printf("%d
    ",res);
    40     }
    41     return 0;
    42 }
    View Code

     剩下题目待补,革命尚未成功,同志仍需努力!

  • 相关阅读:
    Win搭建JAVA环境
    Python JSON存储数据
    XML
    模块5
    模块4
    模块3
    模块2
    模块
    开放封闭原则
    函数续
  • 原文地址:https://www.cnblogs.com/yang-/p/5528593.html
Copyright © 2020-2023  润新知