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

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

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

题目描述

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

输入格式

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

输出格式

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

输入样例

1
2
3 5
4 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,每道题有两个值a和b,a为做这道题需要的时间,b为题目的水值。

输入格式

输入第一行为数据组数T(T≤10),接下来T组数据,每组数据中第一行为两个数t和n,n为题目的数量,t为总时间,接下来n行,每行两个正整数a和b。(1≤a,t≤1000,1≤n≤100,1≤b≤1000000000)

输出格式

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

输入样例

1
10 2
8 16
6 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    2413
3142    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(m≤n)个石子随机放在节点上,每个节点可以放多个,每一次操作是指把每一个节点上的所有石子都往下移动到他某一个子节点(一个节点有多个石子可以分别移动到不同子节点),如果没有子节点则不移动,无法移动的人输。
学姐说,学弟是绅士应该让学姐先走,其实学姐已经策划好了自己一定会赢,但是这时学弟说,学姐先下那么我来画树和放石子吧,学姐惊呆了。现在她来想知道在新的图上,两人都按最优方案走,自己还能不能赢。

输入格式

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

输出格式

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

输入样例

1
3 1
1 1
1

输出样例

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 111111
vector<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.0≤d≤3.0。

输出格式

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

输入样例

1
104 34
1 24 2.928
48 25 2.605
15 41 1.312
39 42 2.454
3 12 2.080
18 39 1.564
10 36 2.530
97 13 1.589
101 57 1.844
84 39 2.561
0 33 1.831?

输出样例

Shoot!?

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

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

时间: 2024-10-06 12:03:04

【总结】2014新生暑假个人排位赛02的相关文章

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

A. 学姐的桌面 2014新生暑假个人排位赛01 时间限制 1000 ms 内存限制 65536 KB 题目描写叙述 学姐在增加集训队之后.学习了使用ubuntu系统来做题,可是没有了360电脑管家,学姐再也没办法看到她的飞速电脑开机究竟虐了全国多少人.作为一个电脑高手.学姐花了几分钟黑到了360的数据库拿到了全国360用户的开机时间,如今学姐想自己算算究竟打败了百分之多少的人? 输入格式 输入有多组数据. 首先给出数据组数T(T≤10),以下T组数据,每组开头为n(1≤n≤100000),36

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

这次题略水,可能是前面几场的比赛的题目太难了,导致我们都是做完签到题呆着一直没事情干. A. 学姐的数码管 2014新生暑假个人排位赛03 时间限制 1000 ms 内存限制 65536 KB 题目描写叙述 学姐的七段数码管玩的出神入化. 如今给你一个浮点数,你须要把它以七段数码管的形式输出出来. 一个的矩阵来表示七段数码管.若下标均从0開始.则以第0列的两个,第列的两个,第0行的一个.第行的一个,第行的一个表示七个段. 小数点所占矩形为,点在中间最以下一列.每个数字或小数点矩阵用一列空格隔开.

2014年暑假学习的日子

2014年的暑假接近尾声,我开始试着去回顾这个暑假的收获.虽然时间比较短只有40天,但收获还是蛮多的,在这个拿出来和大家晒晒. 思想上: 1.见到一种新事物,知道如何和以前的知识建立联系,从心态上不再有畏惧感: 2.开始试着看API文档(英文版),再次验证了学英语的重要性: 3.有了自己的时间管理,虽然每天都有组长催项目进度,但还是能坚持每天看Android视频: 4.严格控制项目期限,必须在规定时间内完成规定的事,比如我们的机房收费搞了将近半年: 5.开始试着结对学习,比如我.宏杰.一清作为一

记2014年暑假,一个项目,三个框架

在开始动笔之际,看了下博文的标题,突然觉得欠妥,"记2014年暑假,一个项目,三个框架",既然是暑假说明还是学生,今年的6月我已经毕业了,但还在学习,并且在向一名合格的架构师狂奔.你说我矫情也好,做作也罢,现实就是这样的,厚着脸说:咱也矫情一回. 整个暑假,总共四十天,从7月中旬开始到8月底,从技术上看,整个假期都处于看视频,做项目,作总结的过程中,前二十天跟着视频做了DRP的项目,后二十天(到8月26日),看完了三个框架的视频,总结还在继续:从英语上看,这个假期是从听走向说的开始:从

2014年暑假c#学习笔记目录

2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.out参数 二.C#winform编程 1.C#WinForm基础制作简单计算器 2.C#WinForm基础Email分析器 3.C#WinForm基础累加器 4.C#WinForm基础图片(显示和隐藏) 5.C#WinForm基础登陆失败三次退出系统 6.C#WinForm基础城市选择器 三.c#面向

2014年暑假——英语清凉了夏季的炎热

--题记 又是度过了这个城市中一年最热的季节,又是枯燥中夹杂着美丽的学英语的声音.暑假就这么仓促的过去了,是啊,当所有人在感慨时间飞快的时候,有这样一种人是在每天坚持着做一件事的,这样的人都是好样的.我也感慨,时间好快,明天就是开学了,我复制上来早已写好的英语总结. 先不说计算机的学习,想聊一下我的英语.清凉了暑假的炎热. 1.音标 整个暑假英语的学习音标算是一个亮点了,也是进步最大和问题最多的. 开学到8月5日第一遍赖世雄,因为距离这一次的学习是很久之前的事情了,所以这一遍主要是回顾以前学过的

2014,暑假,前进加奋斗。

近期一段时间忙着比赛.忙着复习,忙着考试.就慢慢忘记记录自己的学习路程了,对于7.6号才放假的我来说,真正的大学时光才开启,能够不用再操心上课老师点名没到的情况了,不用再操心没有完整的时间来做项目了,暑假的时间全然属于自己,对于自己技术方面的苛求,以及对新技术的渴望.我能够有个完整的时间来真正的充实一下自己. 当然,对于记录学习历程这件事来说.这段时间我会尽量把自己前段时间做的事以博客专栏的形式来分享出来,尽管还是新手.可是能独立完毕一次完整的项目来说,从中收获的还是非常多的,包含技术,人情,生

2014年暑假总结

概述 时间过得真快啊,不知不觉半年又过去了,这半年发生的事不是太多,但是,每一件事又都是那么的刻骨铭心 学到的技术 java java学习的不是太多,主要有总结了一下之前的j2se,学习了j2ee的理论,学习了drp,drp现没有学习完,在学的过程中停止了,然后,将精力全部放到了.net上. .net 在工作之前,包括在工作时的前一段时间,没有打算继续再往下学习.net,但是,在工作的过程中,发现自己的.net差的很多,缺的很多,而且,学习的不是很全面,之前也纠结到底.net就这么着,还是深入的

暑假集训-8.02总结

学习内容:单调队列算法+巩固队列+Hash思想 今日完成题数(不包含多校):5 今日看书情况:15页 今日心得:       粗心的毛病又来了,写代码时一不小心就犯了点小bug,结果找了好久才找出来,写代码要细心啊.       今天主要学了Hash思想,觉得那本书上的知识点好牛逼啊. 雪花雪花雪花(哈希 思想)  https://www.acwing.com/problem/content/139/ 单调队列算法   https://www.cnblogs.com/zcb123456789/p