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 }
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 }
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 }
剩下题目待补,革命尚未成功,同志仍需努力!