A
按照时间排个序算个斜率。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#include<bitset>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1e10
#define pa pair<int,int>
using namespace std;
struct Point {
int t,x;
};
int cmp(Point a,Point b){
return a.t<b.t;
}
Point p[10005];
int main(){
int T,cas=1;
scanf("%d",&T);
while (T--){
int n;
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d%d",&p[i].t,&p[i].x);
}
sort(p,p+n,cmp);
db max=-1,v;
for (int i=1;i<n;i++){
v=db(1.0*abs(p[i].x-p[i-1].x)/(p[i].t-p[i-1].t*1.0));
if (v>max) max=v;
}
printf("Case #%d: %.2lf\n",cas++,max);
}
return 0;
}
直接的题意是求逆序对数,但是线性的扫一下如果后面有比这个数小的就搞一下,O(n)搞定。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<ctime>
#include<bitset>
#define LL long long
#define db double
#define EPS 1e-15
#define inf 1e10
#define pa pair<int,int>
using namespace std;
int a[1000010];
int main()
{
int t,ii,n,i,Min,ans;
scanf("%d",&t);
for (ii=1;ii<=t;ii++)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
Min=a[n];
ans=0;
for (i=n-1;i>=1;i--)
{
if (a[i]>Min) ans++;
else Min=a[i];
}
printf("Case #%d: %d\n",ii,ans);
}
}
I
求圆环面积交,画图推公式得面积为 大圆交-2*小圆大圆交+小圆交。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define inf 0x7fffffff
#define exp 1e-10
#define PI 3.141592654
using namespace std;
typedef long long ll;
struct Point
{
double x,y;
Point (double x=0,double y=0):x(x),y(y){}
};
double dist(Point a,Point b)
{
double x=(a.x-b.x)*(a.x-b.x);
double y=(a.y-b.y)*(a.y-b.y);
return sqrt(x+y);
}
double Area_of_overlap(Point c1,double r1,Point c2,double r2)
{
double d=dist(c1,c2);
if (r1+r2<d+exp) return 0;
if (d<fabs(r1-r2)+exp)
{
double r=min(r1,r2);
return PI*r*r;
}
double x=(d*d+r1*r1-r2*r2)/(2*d);
double t1=acos(x/r1);
double t2=acos((d-x)/r2);
return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);
}
int main()
{
int t,ncase=1;
double r,R;
Point a,b;
scanf("%d",&t);
while (t--)
{
scanf("%lf%lf",&r,&R);
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
double bb_area=Area_of_overlap(a,R,b,R);
double bs_area=Area_of_overlap(a,R,b,r);
double ss_area=Area_of_overlap(a,r,b,r);
printf("Case #%d: %.6lf\n",ncase++,bb_area-2.0*bs_area+ss_area);
}
return 0;
}