首页 > 代码库 > 【总结】2014新生暑假个人排位赛02

【总结】2014新生暑假个人排位赛02

 

A. 丁神去谷歌 2014新生暑假个人排位赛02

时间限制 1000 ms 内存限制 65536 KB

题目描述

丁神要去Google上班了,去之前丁神想再做一道水题,但时间不多了,所以他希望题目做起来既水又快。现在一共有n道题,编号从1到n,每道题有两个值aba为做这道题需要的时间,b为题目的“水值”,丁神希望做b/a最大的那题。

输入格式

输入第一行为数据组数T(T10),接下来T组数据,每组数据中第一行为一个数nn为题目的数量,接下来n行,每行两个正整数ab。如果两道题b/a的值是一样的就输出a比较小的,如果还一样就输出编号比较靠前的。 1a,b109,1n100000)

输出格式

对于每组数据,输出对应的题目编号,每个输出占一行。

输入样例

123 54 8

输出样例

2
这题一开始排序了,显然不能排序,100W了已经
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>using namespace std;struct Num{    int a,b,id;}num[111111];bool cmp(Num my,Num s){    return my.a==s.a?my.id<s.id:my.a<s.a;}int main(){    #ifndef ONLINE_JUDGE        freopen("D:/in.txt","r",stdin);        //freopen();    #endif    int T;    scanf("%d",&T);    while(T--)    {        int n;scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d%d",&num[i].a,&num[i].b);            num[i].id=i;        }        Num ans=num[1];        for(int i=1;i<=n;i++)        {            if((num[i].b*1.0/num[i].a)>(ans.b*1.0/ans.a))            {                ans=num[i];            }            else if((num[i].b*1.0/num[i].a)==(ans.b*1.0/ans.a))            {                if(num[i].a<ans.a)                {                    ans=num[i];                }                else if (num[i].a==ans.a)                {                    if(num[i].id<ans.id)                        ans=num[i];                }            }        }        printf("%d\n",ans.id);     }    return 0;}

B. 丁神又去谷歌 2014新生暑假个人排位赛02

时间限制 1000 ms 内存限制 65536 KB

题目描述

丁神又要去Google上班了,这一次丁神想多做几道水题,并使题目的总水量最大.丁神同一时刻只能在水一道题,只有做完这道题才能得到它的水值,丁神的总时间为t,现在一共有n道题,编号从1到n,每道题有两个值aba为做这道题需要的时间,b为题目的水值。

输入格式

输入第一行为数据组数T(T10),接下来T组数据,每组数据中第一行为两个数tnn为题目的数量,t为总时间,接下来n行,每行两个正整数ab(1a,t10001n1001b1000000000)

输出格式

对于每组数据,输出对应的最大总水量,每个输出占一行。

输入样例

110 28 166 12

输出样例

16
裸01背包
被编译器坑了,学校机房用的机子%lld不认,只能是%I64d
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>using namespace std;const int N=111111;long long w[N];long long v[N];long long dp[1111];int main(){    #ifndef ONLINE_JUDGE        freopen("D:/in.txt","r",stdin);        //freopen();    #endif    long long T,t,n;    cin>>T;    while(T--)    {        memset(dp,0,sizeof(dp));        cin>>t>>n;        //cout<<"n::"<<t<<endl;        for(long long i=0;i<n;i++)        {            cin>>w[i]>>v[i];        }        for(long long i=0;i<n;i++)        {            for(long long j=t;j>=w[i];j--)            {                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);            }        }        cout<<dp[t]<<'\n';    }    return 0;}

C. goblin 2014新生暑假个人排位赛02

时间限制 1000 ms 内存限制 65536 KB

题目描述

现有一段横向长度为N的山脉,其中每段有一个独一无二的高度Hi(1到N之间的正整数)。现在你想知道对于长度为N的山脉,可能有这样的山脉多少种。这样的山脉是:某个位置要么比两边的高度都低,要么比两边的高度都高。两座山脉 A和 B 不同当且仅当存在一个 i,使得 Ai≠Bi。由于这个数目可能很大,你只对它除以 P 的余数感兴趣。

输入格式

输入以EOF为结束,每组仅含一行,两个正整数 N, P。 3≤N≤4200,P≤10^9

输出格式

对于每组数据输出仅含一行,一个非负整数,表示你所求的答案对 P 取余之后的结果。

输入样例

4 7

输出样例

3说明:共有 10 种可能的山脉,它们是:1324    1423    2143    2314    24133142    3241    3412    4132    4231 
这题很有意思,会爆内存,那么,我们还是申请int类型的数组来存数据,在运算的时候转化一下就是了。
求组合数也挺有意思。因为这道题每次取模都不同,所以每次都要重新算组合数c和结果g,用递推算cij=ci-1j+ci-1j-1
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int N=4333;int c[N][N];int g[N];int n,p;int main(){    while(scanf("%d%d",&n,&p)!=EOF)    {        memset(g,0,sizeof(g));        c[1][0]=1;        c[1][1]=1;        g[0]=g[1]=1%p;g[2]=1%p;g[3]=2%p;        for(int i=2;i<=n;i++)        {            for(int j=0;j<=i;j++)            {                if(j==0||j==i)                    c[i][j]=1;                else                    c[i][j]=(c[i-1][j]%p+c[i-1][j-1]%p)%p;            }        }        /*for(int i=1;i<=8;i++)        {            for(int j=1;j<=i;j++)                cout<<"i::"<<i<<"j::"<<j<<' '<<c[i][j]<<endl;        }*/        for(int j=3;j<=n;j++)        {            for(int i=0;i<=j-1;i+=2)            {                //cout<<g[j+1]<<endl;                g[j+1]=(g[j+1]+((long long)c[j][i]%p*(long long)g[i]%p*(long long)g[j-i])%p)%p;                //g[j+1]/=2;                if(((j+1)&1)&&i==0)                    g[j+1]=g[j+1]*2%p;            }        }        printf("%d\n",(g[n]*2)%p);    }    return 0;}

D. 学姐逗学弟 2014新生暑假个人排位赛02

时间限制 3000 ms 内存限制 131072 KB

题目描述

学弟们来了之后,学姐每天都非常高兴的和学弟一起玩耍。这一天,学姐想出了这样一个游戏,她画了一棵树,树上共有n个节点,现在学姐把m(mn)个石子随机放在节点上,每个节点可以放多个,每一次操作是指把每一个节点上的所有石子都往下移动到他某一个子节点(一个节点有多个石子可以分别移动到不同子节点),如果没有子节点则不移动,无法移动的人输。 学姐说,学弟是绅士应该让学姐先走,其实学姐已经策划好了自己一定会赢,但是这时学弟说,学姐先下那么我来画树和放石子吧,学姐惊呆了。现在她来想知道在新的图上,两人都按最优方案走,自己还能不能赢。

输入格式

输入第一行为一个整数T表示数据组数,接下来T组数据,每组开头为两个整数n,m,表示节点个数和石子个数,1mn100000,接下来一行n?1个整数,表示2到n节点的父亲节点编号,接下来一行m个整数,表示每一个石子的位置。数据保证1为根节点。

输出格式

如果学姐能胜利,输出"MengMengDa!",否则输出"So sad..."。没有引号。

输入样例

13 11 11

输出样例

MengMengDa!

everySG,正好前一天晚上看了EVERYSG。先算各个节点的SG值,再算各个节点的步数(赢的节点的步数是儿子节点中输的节点中的最大步数+1,输的节点的步数是儿子节点中赢的节点中的最小步数+1)。节点只关心有没有石头而不关心有几个石头,因为有几个石头都是一样的。找出给出的节点中最长的步数,奇数则先手赢,偶数则后手赢
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>#include <cstring>#include <vector>using namespace std;#define N 111111vector<int> G[N];int getLosestep(int x);int fa[N];int sg[N];int step[N];int getsg(int x){    if(sg[x]!=-1)        return sg[x];    bool vis[11111];    memset(vis,0,sizeof(vis));    for(int i=0;i<G[x].size();i++)    {        vis[getsg(G[x][i])]=true;    }    for(int i=0;i<11111;i++)    {        if(!vis[i])        {            return sg[x]=i;        }    }}/*int getWinstep(int x){    int ans=0;    if(winstep[x]!=-1)        return winstep[x];    for(int i=0;i<G[x].size();i++)    {        if(sg[G[x][i]==0])        {            ans=max(ans,getLosestep(G[x][i]));            ans++;        }    }    return winstep[x]=ans;    //cout<<"x::"<<}int getLosestep(int x){    int ans=(1<<29);    if(losestep[x]!=-1)        return losestep[x];    for(int i=0;i<G[x].size();i++)    {        if(sg[G[x][i]!=0])        {            ans=min(ans,getWinstep(G[x][i]));            ans++;        }    }    if(ans==(1<<29))        ans=0;    return losestep[x]=ans;}*/int getstep(int x){    if(step[x]!=-1)        return step[x];    //if(G[x].size()==0)        //return 0;    if(sg[x]==0)    {        if(step[x]!=-1)            return step[x];        int ans=1<<29;        if(G[x].size()==0)            return step[x]=0;        for(int i=0;i<G[x].size();i++)        {            if(sg[G[x][i]]!=0)            {                ans=min(ans,getstep(G[x][i]));            }        }        return step[x]=ans+1;    }    else    {        if(step[x]!=-1)            return step[x];        int ans=0;        if(G[x].size()==0)            return step[x]=0;        for(int i=0;i<G[x].size();i++)        {            if(sg[G[x][i]]==0)            {                ans=max(ans,getstep(G[x][i]));            }        }        return step[x]=ans+1;    }}int main(){    #ifndef ONLINE_JUDGE        freopen("D:/in.txt","r",stdin);        //freopen();    #endif    int T;    scanf("%d",&T);    while(T--)    {        for(int i=0;i<N;i++)            G[i].clear();        //memset(winstep,-1,sizeof(winstep));        //memset(losestep,-1,sizeof(losestep));        memset(step,-1,sizeof(step));        memset(sg,-1,sizeof(sg));        int n,m;        scanf("%d%d",&n,&m);        for(int i=2;i<=n;i++)        {            scanf("%d",&fa[i]);        }        for(int i=2;i<=n;i++)        {            G[fa[i]].push_back(i);        }        for(int i=1;i<=n;i++)            getsg(i);        //getWinstep(1);        //getLosestep(1);        //getWinstep(1);        //getLosestep(1);        for(int i=1;i<=n;i++)            getstep(i);        int longwin=0;        int shortlose=0;        for(int i=1;i<=m;i++)        {            int pos;scanf("%d",&pos);            if(sg[pos]==0)            {                shortlose=max(shortlose,step[pos]);            }            else            {                longwin=max(longwin,step[pos]);            }        }        /*if(shortlose==(1<<29)) shortlose=0;        //cout<<"sg::"<<sg[1]<<endl;        //cout<<"l,s::"<<longwin<<","<<shortlose<<endl;*/        if(longwin>shortlose)            puts("MengMengDa!");        else            puts("So sad...");    }    return 0;}

E. 木头人足球赛 2014新生暑假个人排位赛02

时间限制 1000 ms 内存限制 65536 KB

题目描述

木头人星的行动速度是地球上乌龟的1/10(所以可以忽略移动的速度),可是他们也热爱运动,尤其是足球。 他们的足球规则跟人类的一样,足球场尺寸为标准 105 * 68,两队各 11 名球员参赛。 假设 Mays 队的每个队员都是专业的球员,踢球都特别准。而她们的对手 Luke 队截球的规律是,如果行进的球离自己的距离不超过d,就可以截球成功。 现在 Mays 队的十号球员拿到了球,如果只允许一次射门,Mays 队能不能进球呢? 足球场在xy平面内,(0,0)至(105,68)矩形范围内,边缘与x,y轴平行且不能站人。其中Luke队的球门为(0, 30)-(0, 38),Mays 队的球门为(105,30)-(105, 38)

输入格式

第一行为组数T ,对这T组数据,每组第一行是Mays队十号球员的坐标x0,y0,接下来 11 行为 Luke 队的 1 - 11 号队员的属性 xi,yi,di, 其中xi,yi表示 i 号球员的坐标,di表示i号球员截球能力值。 保证所有坐标不重复且都在球场范围内,x,y为整数,d为正实数 1.0d3.0

输出格式

每组数据一行,如果 Mays 队10号队员直接可以射门得分,则输出“Shoot!??”;如果10号队员不能成功射门,输出"Poor Mays!??".

输入样例

1104 341 24 2.92848 25 2.60515 41 1.31239 42 2.4543 12 2.08018 39 1.56410 36 2.53097 13 1.589101 57 1.84484 39 2.5610 33 1.831?

输出样例

Shoot!?
还在写,,,= =!还没写粗,,,wa了