转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
表示没有rate,没动力。。。
A. Bicycle Chain
很少,找出比例最大的有多少个,暴力
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 2000000
#define LL long long
#define eps 1e-7
using namespace std;
int n,m,a[100],b[100];
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
int mmax=0,cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(b[j]%a[i]==0){
if(b[j]/a[i]==mmax)
cnt++;
else if(b[j]/a[i]>mmax){
mmax=b[j]/a[i];
cnt=1;
}
}
printf("%d\n",cnt);
}
return 0;
}
B. Olympic Medal
得出公式:(pi*r1*r1-pi*r2*r2)*p2/(pi*r2*r2*p1)=A/B进行化简后得到 r2^2=(1+A*p1/B*p2)*r1*r1
得到r2=sqrt(r1*r1*b*p1/(A*p2+B*p1))
如果要得到r2最大,显然p1要最大,p2要最小,r1要最大
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 2000000
#define LL long long
#define inf 1<<29
#define eps 1e-7
using namespace std;
int n,m,k,x[5000],y[5000],z[5000];
int main(){
while(scanf("%d",&n)!=EOF){
int r1=0;
for(int i=0;i<n;i++){
scanf("%d",&x[i]);
r1=max(r1,x[i]);
}
scanf("%d",&m);
int p1=0;
for(int i=0;i<m;i++){
scanf("%d",&y[i]);
p1=max(p1,y[i]);
}
int p2=inf;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d",&z[i]);
p2=min(p2,z[i]);
}
int a,b;
scanf("%d%d",&a,&b);
double r2=sqrt((double)r1*r1*b*p1*1.0/(a*p2+b*p1));
printf("%.10f\n",r2);
}
return 0;
}
C. Crosses
枚举统计,见代码注释。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 2000000
#define LL long long
#define inf 1<<29
#define eps 1e-7
using namespace std;
int n,m,s;
int main(){
while(scanf("%d%d%d",&n,&m,&s)!=EOF){
LL ans=0;
//枚举第一个矩阵的长和宽,注意都为奇数
for(int i=1;i<=n;i+=2)
for(int j=1;j<=m;j+=2){
LL area1=i*j;
//如果第一个矩形刚好就是总面积
if(area1==s)
//2*(i/2+1)*(j/2+1)-1表示的是a,b,c,d选择的可能性,确定一个矩阵之后,另外一组要求就可以在一定范围内任意取
//(n-i+1)纵向中心的选择
//(m-j+1)横向中心的选择
ans+=(LL)(2*(i/2+1)*(j/2+1)-1)*(n-i+1)*(m-j+1);
else if(area1<s){
LL area2=s-area1;
//第二个矩阵多出的面积,两边对称,肯定为偶数
if(area2%2==0)
//枚举额外的宽
for(int k=2;k+j<=m;k+=2)
if(area2%k==0){
int t=area2/k;
//高度比原先的小
if(t<i&&t&1)
ans+=(LL)2*(n-i+1)*(m-k-j+1);
}
}
}
printf("%I64d\n",ans);
}
return 0;
}
D. Hot Days
直接贪心,YY出几种可行解。
首先考虑一种特殊情况,避免RE:原有温度比上限高,表示肯定要上诉,肯定只需要一辆车
其余情况:
1、用最少的车,每辆车刚好达上限,全无上诉
2、只用一辆车
3、只有一辆车超了,其它车刚好满
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 2000000
#define LL long long
#define inf 1<<29
#define eps 1e-7
using namespace std;
int n,m;
LL t,T,x,cost;
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
LL ans=0;
for(int i=0;i<n;i++){
scanf("%I64d%I64d%I64d%I64d",&t,&T,&x,&cost);
LL temp;
if(t>=T)
ans+=cost+m*x;
else{
LL p=T-t;
LL k=m/p+(m%p==0?0:1);
temp=k*cost;
if(p*x<=cost)
temp=min(temp,cost+x*m);
else{
LL num=m%p+p;
if(m%p==0)
num+=p;
if(num<=m)
temp=min(cost*(k-1)+num*x,temp);
}
ans+=temp;
}
}
printf("%I64d\n",ans);
}
return 0;
}
E. Periodical Numbers
求区间内,二进制出现循环节的数有多少个,求指导