奋斗群群赛11—筚路蓝缕
T1:The Wall
题目位置:
题意:
可以想象有一排的树,输入x,y表示每隔x倍数个树就染成红色,每隔y倍数个树就染成粉色,
再输入 l r 问你之间有多少的树是2 种颜色都是染的,输出个数!
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=2000000005;
int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int x,y,a,b,all=0;
//cout<<gcd(18,27);
scanf("%d%d%d%d",&x,&y,&a,&b);
int tot=(x*y)/gcd(x,y);
all=b/tot-(a-1)/tot;
printf("%d\n",all);
}
小反思:
就是算GCD的题目!
T2:Maximal Area Quadrilateral
题目位置:
题意:
给你n个点的坐标,问最大的四边形的面积,由n个之中的4 个组成
就是 2个循环找i 与 j 2点,再开哦一个循环,找在i-j线上的三角形的面积最大,以及在线下的面积最大的点就好了!
于是面积就是:
( x[k]*(y[i]-y[j])+ x[j]*(y[k]-y[i])+ x[i]*+(y[j]-y[k]) ) / 2.0;
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N=5005;
int x[N],y[N];
double S(int i,int j,int k)
{
return ( x[k]*(y[i]-y[j])+ x[j]*(y[k]-y[i])+ x[i]*+(y[j]-y[k]) ) / 2.0;
}
double mx=0.0;
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(i==j) continue;
double fu=-9999999,zheng=-9999999;
for(int k=1; k<=n; k++)
{
if(i==k||k==j)
continue;
if(S(i,j,k)<0)
{
fu=max(-S(i,j,k),fu);
// cout<<"fu="<<fu<<endl;
}
if(S(i,j,k)>0)
{
zheng=max(S(i,j,k),zheng);
// cout<<"zheng="<<zheng<<endl;
}
}
double tot=zheng+fu;
if(tot>mx)
mx=tot;
}
printf("%.10lf\n",mx);
return 0;
}
小反思:
还是那句话,尽量压缩循环的次数!
T3:Tourist Problem
题目位置:
题意:
有n个数 做其全排列,每一次的出来一个全排列之后将相邻两个元素的绝对值,加起来,当然第一个数就是与前面的数做差(即 0)求所有的全排列的值与(n)!的比值!
解释一个样例:
Consider 6 possible routes:
[2, 3, 5]: total distance traveled: |2 – 0| + |3 – 2| + |5 – 3| = 5;
[2, 5, 3]: |2 – 0| + |5 – 2| + |3 – 5| = 7;
[3, 2, 5]: |3 – 0| + |2 – 3| + |5 – 2| = 7;
[3, 5, 2]: |3 – 0| + |5 – 3| + |2 – 5| = 8;
[5, 2, 3]: |5 – 0| + |2 – 5| + |3 – 2| = 9;
[5, 3, 2]: |5 – 0| + |3 – 5| + |2 – 3| = 8.
The average travel distance is = = .
AC代码(做法一):
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long a[N];
long long gcd(long long x,long long y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
long long n,sum=0,all=1,tot=0,k=0,s3=0;
scanf("%lld",&n);
for(long long i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
tot=sum;
sort(a+1,a+1+n);
for(long long i=1; i<=n; i++)
{
if(i>1)
s3+=a[i-1];
k+=(i-1)*a[i]-s3;
}
//cout<<k<<endl;
tot+=2*k;
long long p=gcd(tot,n);
printf("%lld %lld\n",tot/p,n/p);
}
AC代码(做法2)
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long a[N];
long long gcd(long long x,long long y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
long long n,sum=0,all=1,tot=0,k=0;
scanf("%lld",&n);
for(long long i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
tot=sum;
sort(a+1,a+1+n);
for(long long i=1; i<n; i++)
{
sum-=a[i];
k+=sum-(n-i)*a[i];
}
tot+=2*k;
long long p=gcd(tot,n);
printf("%lld %lld\n",tot/p,n/p);
}
小反思:
是一道数学证明题目!