codeforce#488div2 20180624

A水題
B
騎士互啄
給N個人有錢和戰力
能夠搶奪最多K個人的錢
輸出最大錢

解法
根據戰力排序
暴力維護能夠吃的前面的人中前K個人的最大金錢即可

#include<bits/stdc++.h>
#define FOR(i,j,k) for (i = j;i<=k;++i)
#define FOD(i,j,k) for(i = j;i>=k;--i)
#define mal 0x3fffffff
typedef long long ll;
void fre(){freopen("1.txt","r",stdin);}
using namespace std;
struct P{
    long long ord;
    long long mon;
    long long str;
    long long sco;
}t[100003];
long long n,m;
long long k;
long long f[1003];
long long comp(P x,P y)
{
    return x.str<y.str;
}
long long com2(P x,P y)
{
    return x.ord<y.ord;
}
void init()
{
    cin>>n>>k;
    long long i;
    FOR(i,1,n)
    {
        t[i].ord = i;
        cin>>t[i].str;
    }
    FOR(i,1,n)
    cin>>t[i].mon;
    sort(t+1,t+1+n,comp);
}
inline long long s()
{
    long long su =0;
    long long i;
    FOR(i,1,k)
    su+=f[i];
    return su;
}
void upd(long long x)
{
    long long i,j;
    j = k + 1;
    if (x<f[k]) return ;
    FOR(i,1,k)
    {
        if (f[i]<x)
        {
            j = i;
            break;
        }
    }
    FOD(i,k,j+1)
    {
        f[i]=f[i-1];
    }
    f[j]=x;
}
void done()
{
    long long i;
    FOR(i,1,n)
    {
        t[i].sco=s()+t[i].mon;
        upd(t[i].mon);
    }
    sort(t+1,t+1+n,com2);
    FOR(i,1,n)
    {
        cout<<t[i].sco<<' ';
    }
}
int main()
{
    //fre();
    init();
    done();
}

C計算幾何,計算每個邊和對角線的相交情況
相交即可
有點Bug
數據水就過了。。。。
ps:正解也是水的差不多,emm比較嚴格一點
驗證是否有其中一個角或者中心在對面內即可
通過圍繞驗證點旋轉成平行座標避免複雜斜率計算是個亮點
不需要Onleft函數進行驗證

#include<bits/stdc++.h>
#define FOR(i,j,k) for (i = j;i<=k;++i)
#define FOD(i,j,k) for(i = j;i>=k;--i)
#define mal 0x3fffffff
typedef long long ll;
void fre(){freopen("1.txt","r",stdin);}
using namespace std;
const double EPS=1e-9,PI=acos(-1);
typedef complex<double> Coord;
#define X real()
#define Y imag()
struct Line
{
    Coord p,v;
    Line(Coord p=Coord(),Coord v=Coord()):p(p),v(v) {}
    Coord point(double t)
    {
        return p+v*t;
    }
};
struct Circle
{
    Coord c;
    double r;
    Circle(Coord c=Coord(),double r=0):c(c),r(r) {}
    Coord point(double t)//t???,??
    {
        return c+polar(r,t);
    }
};

double Dot(Coord A,Coord B)
{
    return A.X*B.X+A.Y*B.Y;
}

double Cross(Coord A,Coord B)
{
    return A.X*B.Y-B.X*A.Y;
}

int sgn(double d)
{
    return (d>EPS)-(d<-EPS);
}

bool operator!=(const Coord &A,const Coord &B)//?????,???????????
{
    return sgn(A.X-B.X)||sgn(A.Y-B.Y);
}

bool operator==(const Coord &A,const Coord &B)
{
    return !(A!=B);
}

bool cmpCoord(const Coord &A,const Coord &B)//????????,????????????
{
    return sgn(A.X-B.X)?
           A.X<B.X:
           A.Y+EPS<B.Y;
}

bool cmpLine(const Line &A,const Line &B)//?????,??????
{
    return arg(A.v)<arg(B.v);
}

bool SegmentProperIntersection(Coord A1,Coord A2,Coord B1,Coord B2)//??????,???????????
{
    double C1=Cross(A2-A1,B1-A1),C2=Cross(A2-A1,B2-A1),
           C3=Cross(B2-B1,A1-B1),C4=Cross(B2-B1,A2-B1);
    return sgn(C1)*sgn(C2)<0&&sgn(C3)*sgn(C4)<0;
}

bool onSegment(Coord P,Coord A1,Coord A2)//?????????,?????
{
    return sgn(Dot(A1-P,A2-P))<0&&!sgn(Cross(A1-P,A2-P));
}
bool onLeft(Coord P,Line L)//p???????L??,????
{
    return Cross(L.v,P-L.p)>0;
}
Coord a[6];
Coord b[6];
Coord v1(0,1);
Coord v2(1,0);
Coord v3(1,1);
Coord v4(1,-1);
int init()
{
    int i,j,k,l;
    int t;
    FOR(i,1,4)
    {
        cin>>t;
        a[i].real(t);
        cin>>t;
        a[i].imag(t);
    }
    a[5].real(a[1].X);
    a[5].imag(a[1].Y);
    b[5].real(b[1].X);
    b[5].imag(b[1].Y);
    FOR(i,1,4)
    {
        cin>>t;
        b[i].real(t);
        cin>>t;
        b[i].imag(t);
    }
    FOR(i,1,4)
        FOR(j,1,4)
            if (a[i] == b[j]) return 1; 
    FOR(i,1,4)
        FOR(j,1,4)
            //if (abs(i-j)==1 || i==1 && j==4 || i==4 && j==1)
            {

                FOR(k,1,4)
                    FOR(l,1,4)
                    //  if (abs(k-l)==1 || k==1 && l==4 || k==4 && l==1)
                        {

                            if (SegmentProperIntersection(a[i],a[j],b[k],b[l])) return 1;
                            if (onSegment(a[i],b[k],b[l])) return 1;
                            if (onSegment(b[i],a[k],a[l])) return 1;
                        }
            }
/*  int bj=0;
    FOR(i,1,4)
        {
            Line s1(b[1],b[2]);
            Line s2(b[2]

        }*/

    return 0;                               


}
int main()
{
    //fre();
    if (init()) puts("YES");
    else puts("NO");

}

D匹配
兩個人知道各自知道一個相差一個數字的數對
通過發一系列數對,其中包括有初始數對,找出那個數

暴力全查找
3種情況
1.一個或多個對指出僅僅有一個數字可能,直接輸出之
2.多個對指出有多個數字可能且不重複,輸出0
3.2的條件下重複,輸出-1

#include<bits/stdc++.h>
#define FOR(i,j,k) for (i = j;i<=k;++i)
#define FOD(i,j,k) for(i = j;i>=k;--i)
#define mal 0x3fffffff
typedef long long ll;
void fre(){freopen("1.txt","r",stdin);}
using namespace std;
int n,m;
struct S{
    int x;
    int y;
}a[1000],b[1000];
void init()
{
    int i,j,k;
    cin>>n>>m;
    FOR(i,1,n)
        {
            cin>>j>>k;
            if (j>k) swap(j,k);
            a[i].x=j;
            a[i].y=k;
    }
    FOR(i,1,m)
        {
            cin>>j>>k;
            if (j>k) swap(j,k);
            b[i].x=j;
            b[i].y=k;
    }
}
inline int d1(int x,int y)
{
    int u = 0;
    int ans = 0;
    int i,j;
    if (a[x].x==b[y].x) {u++;ans = b[y].x;}
    if (a[x].x==b[y].y) {u++;ans = b[y].y;}
    if (a[x].y==b[y].x) {u++;ans = b[y].x;}
    if (a[x].y==b[y].y) {u++;ans = b[y].y;}
    if (u==1) return ans;
    else return 0;
}
int a1[1000],b1[10000];
int done()
{
    int ans=-100;
    int i,j,k;
    int bj = 0;
    int conf = 0;
    FOR(i,1,n)
      FOR(j,1,m)
        if (d1(i,j))
        {
            if (a1[i]!=d1(i,j) && a1[i] || b1[j] && b1[j]!=d1(i,j)) conf = 1;
            if (ans!=d1(i,j)) bj++;
            ans = d1(i,j);

            a1[i] = d1(i,j);
            b1[j] = d1(i,j);
        }
    if (bj > 1) if (conf) return -1;else return 0;
    else return ans;
}
int main()
{
    //fre();
    init();
    cout<<done();
}


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