天天看點

BUPT 2014新生暑假個人排位賽02 A. 丁神去谷歌 B. 丁神又去谷歌 C. goblin  D. 學姐逗學弟 E. 木頭人足球賽

A. 丁神去谷歌

注意将除法改成交叉相乘

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
 
using namespace std;
 
 
template<class T>
inline bool read(T &n)
{
    T x = 0, tmp = 1; char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
 
const int MAXN=10000000000;
int n;
 
int main()
{
    long long T,ma,mb,num=0;
    read(T);
    while(T--)
    {
        int a,b;
        read(n);
        read(ma),read(mb),num=1;
        for(int i=1;i<n;i++)
        {
            read(a);read(b);
            if(b*ma>a*mb)
            {
                ma=a;
                mb=b;
                num=i+1;
            }
            else if(b*ma==a*mb&&ma>a)
            {
                ma=a;
                mb=b;
                num=i+1;
            }
            else if(b*ma==a*mb&&ma==a&&num>i+1)
            {
                ma=a;
                mb=b;
                num=i+1;
            }
        }
        printf("%lld\n",num);
    }
    return 0;
}
           

B. 丁神又去谷歌

裸01背包

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
 
using namespace std;
 
 
template<class T>
inline bool read(T &n)
{
    T x = 0, tmp = 1; char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
//-------------------------------------------------------------------
 
typedef long long ll;
 
struct Node
{
    int ti,w;
}a[110];
 
int n,t;
ll dp[110][1010];
 
 
int main()
{
    int T;
    read(T);
    while(T--)
    {
        memset(dp,0,sizeof(dp));
        read(t);read(n);
        for(int i=1;i<=n;i++)
        {
            read(a[i].ti);read(a[i].w);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=t;j++)
            {
                dp[i][j]=dp[i-1][j];
                if(a[i].ti<=j)
                    dp[i][j]=max(dp[i-1][j-a[i].ti]+a[i].w,dp[i][j]);
            }
        }
         printf("%lld\n",dp[n][t]);
    }
    return 0;
}
           

C. goblin 

數學題,排列組合。 首先,我們注意到這道題的某些公式,取模時候的除法,因為p不一定是質數,是以不一定能夠用費馬小定理求出逆元,是以一定要改變方法。 其次,我們可以發現這題是要求波浪數的個數,這種時候我比較推薦大家打表找規律,如形如/\/\/\/\/\(下稱為A型)或者\/\/\/\/\/\/(下稱為B型)的數字,當數字位數相同的時候,我們可以得知,A型數和B型數的個數是 相同的,這一點我們可以通過逆序數證明,大家可以去百度一下證明方法。 那麼,我們就可以将某些除以二的公式給略加改進

BUPT 2014新生暑假個人排位賽02 A. 丁神去谷歌 B. 丁神又去谷歌 C. goblin  D. 學姐逗學弟 E. 木頭人足球賽

g[i]表示的是A型(也可以是B型,但隻能是其中一個)的波浪數個數,用組合數學的 插入法求出遞推公式,注意,此時的g[i]隻能當做一種類型來使用,是以每次記錄都是j+=2的情況。

另外,如果數組都用long long 型,記憶體會爆,如果計算過程不用long long ,資料會爆。

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
 
#define EPS 1e-10
#define eps 1e-8
 
using namespace std;
 
 
template<class T>
inline bool read(T &n)
{
    T x = 0, tmp = 1; char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
//-------------------------------------------------------------------
 
const int MAXN=4300;
 
int n,p;
int g[MAXN];
int c[MAXN][MAXN];
 
 
int main()
{
//    freopen("data.txt","r",stdin);
    while(read(n)&&read(p))
    {
        memset(g,0,sizeof(g));
        for(int i=1;i<=n;i++)
            c[i][0]=1;
        c[1][1]=1;
        for(int i=2;i<=n;i++)
        {
            c[i][i]=1;
            for(int j=1;j<i;j++)
                c[i][j]=(c[i-1][j-1]%p+c[i-1][j]%p)%p;
        }      
        g[0]=1%p;g[1]=1%p;g[2]=1%p;g[3]=2%p;
        for(int i=4;i<=n;i++)
            for(int j=0;j<=i-1;j+=2)
            g[i]=(g[i]+((long long)c[i-1][j]%p*(long long)g[j]%p*(long long)g[i-1-j])%p)%p;
        g[n]=(g[n]*2)%p;
/*        int ans=0;
        for(int i=0;i<n;i++)
            a[i]=i+1;
        do
        {
            int i;
            for(i=1;i<n-1;i++)
            {
                if(a[i]>a[i-1]&&a[i]>a[i+1])
                    continue;
                else if(a[i]<a[i-1]&&a[i]<a[i+1])
                    continue;
                break;
            }
            if(i==n-1)
                ans++;
        }while(next_permutation(a,a+n));
        cout<<n<<" : "<<ans<<endl;*/
        cout<<g[n]<<endl;
    }
    return 0;
}
           

D. 學姐逗學弟

裸的EVERY SG 自己去看看模闆或者解法吧.......

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
 
using namespace std;
 
 
template<class T>
inline bool read(T &n)
{
    T x = 0, tmp = 1; char c = getchar();
    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
    if(c == EOF) return false;
    if(c == '-') c = getchar(), tmp = -1;
    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
    n = x*tmp;
    return true;
}
//-------------------------------------------------------------------
 
const int MAXN=100010;
int n,m;
vector<int> a[MAXN];
int sg[MAXN],po[MAXN];
bool mex[MAXN];
int step[MAXN];
 
void dfs(int x)
{
    if(sg[x]!=-1)
        return;
    int sz=a[x].size(),maxx=-1*MAXN,minn=MAXN;
    for(int i=0;i<sz;i++)
    {
        dfs(a[x][i]);
        if(sg[a[x][i]]==0)
            maxx=max(maxx,step[a[x][i]]);
        minn=min(minn,step[a[x][i]]);
    }
    memset(mex,0,sizeof(bool)*(sz+10));
    for(int i=0;i<sz;i++)
        mex[sg[a[x][i]]]=true;
    for(int i=0;i<sz+1;i++)
        if(!mex[i])
        {
            sg[x]=i;
            break;
        }
   if(sg[x]==0)
        step[x]=minn+1;
    else
        step[x]=maxx+1;
    if(sz==0)
        step[x]=0;
//    cout<<x<<" :"<<sg[x]<<endl;
}
 
void init()
{
    for(int i=0;i<MAXN;i++)
        a[i].clear();
    memset(sg,-1,sizeof(sg));
    memset(po,0,sizeof(po));
    memset(step,0,sizeof(step));
}
 
int main()
{
    int T;
    read(T);
    while(T--)
    {
        read(n);read(m);
        init();
        for(int i=2;i<=n;i++)
        {
            int temp;
            read(temp);
            a[temp].push_back(i);
        }
        for(int i=0;i<m;i++)
            read(po[i]);
        dfs(1);
        int ans=-1;
        for(int i=0;i<m;i++)
        {
            ans=max(step[po[i]],ans);//cout<<step[po[i]]<<" ";
        }//    cout<<endl;
        if(!(ans&1))
            puts("So sad...");
        else
            puts("MengMengDa!");
    }
    return 0;
}
           

E. 木頭人足球賽

計算幾何 大堯神代碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
//#define LOCAL
using namespace std;
struct point
{
    double x,y,d,AngleUp,AngleDown;
}Luke[20];
struct PP
{
    double x,y;
}UnCovered[20];
const double eps=1e-7;
const double pi=acos(-1.0);
double xo,yo,AngleUp,AngleDown;
int negativecnt;
bool flag;
bool GetLukeAngle(int x)
{
    int i;
    double d=sqrt((xo-Luke[x].x)*(xo-Luke[x].x)+(yo-Luke[x].y)*(yo-Luke[x].y));
    //printf("d=%lf\n",d);
    if(abs(Luke[x].d-d)<eps)return false;
    double a=asin(Luke[x].d/d),b;
    //printf("a=%lf\n",a);
    double dy=Luke[x].y-yo,dx=Luke[x].x-xo;
    //printf("dy=%lf dx=%lf\n",dy,dx);
    b=atan2(dy,dx);
    //printf("b=%lf\n",b);
    if(b>eps)b=3*pi/2-b;
    else if(b<-eps)b=-pi/2-b;
    else b=pi*3/2;
    Luke[x].AngleDown=b-a;
    Luke[x].AngleUp=b+a;
    //printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",x,Luke[x].AngleDown,x,Luke[x].AngleUp);
    return true;
}
bool cmp(const point &a,const point &b)
{
    if(abs(a.AngleDown-b.AngleDown)<eps)return a.AngleUp+eps<b.AngleUp;
    return a.AngleDown+eps<b.AngleDown;
}
void Init()
{
    scanf("%lf%lf",&xo,&yo);//printf("xo=%lf yo=%lf\n",xo,yo);//cout<<xo<<' '<<yo<<endl;
    AngleUp=atan2(38.000-yo,-xo);
    if(AngleUp<-eps)AngleUp=-AngleUp-pi/2;
    else if(AngleUp>eps) AngleUp=pi*3/2-AngleUp;
    AngleDown=atan2(30.000-yo,-xo);
    if(AngleDown<-eps)AngleDown=-AngleDown-pi/2;
    else if(AngleDown>eps) AngleDown=pi*3/2-AngleDown;
    //printf("Angledown=%lf AngleUp=%lf\n",AngleDown,AngleUp);
    //cout<<AngleDown<<' '<<AngleUp<<endl;
    flag=true;
    for(int i=1;i<=11;i++)
    {
        scanf("%lf %lf %lf",&Luke[i].x,&Luke[i].y,&Luke[i].d);
        if(flag==true)flag=GetLukeAngle(i);
    }
    //cout<<flag<<endl;
}
void Solve()
{
 
    sort(Luke+1,Luke+1+11,cmp);//for(int i=1;i<=11;i++)printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",i,Luke[i].AngleDown,i,Luke[i].AngleUp);
    //for(int i=1;i<=11;i++)printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",i,Luke[i].AngleDown,i,Luke[i].AngleUp);
    flag=false;
    double start=AngleDown;
    for(int i=1;i<=11;i++)
    {
            if(Luke[i].AngleUp+eps<AngleDown)continue;
            if(Luke[i].AngleDown>AngleUp+eps)continue;
            if(Luke[i].AngleDown>start+eps)
            {
                flag=true;break;
            }
            else if(Luke[i].AngleUp>start+eps)start=Luke[i].AngleUp;
    }
    if(flag==false&&start+eps<AngleUp)flag=true;
}
int main()
{
    #ifdef LOCAL
    freopen("input.txt","r",stdin);
    #endif // LOCAL
    int T;
    scanf("%d",&T);
    //cout<<T<<endl;
    while(T--)
    {
        Init();//if(T==6)printf("%d\n",flag);
        if(flag==true)Solve();
        if(flag)printf("Shoot!\n");
        else printf("Poor Mays!\n");
        //Solve();
    }
    return 0;
}