2014 北京區域賽題目

按照時間排個序算個斜率。

#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;
}


K

直接的題意是求逆序對數,但是線性的掃一下如果後面有比這個數小的就搞一下,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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章