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\n",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\n", 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\n",res);
40     }
41     return 0;
42 }
View Code

 

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

 

posted @ 2016-05-25 21:37  初见、  阅读(322)  评论(0编辑  收藏  举报