(2015省赛系列--团体热身赛第二场)

分完了队伍:我 littleyellow and c风(无形装b.....最为致命Orz)

BNU ACM校队时间安排表

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29377

ICPC,全称国际大学生程序设计竞赛,由美国计算机协会(ACM)主办。它是一项非常公平的比赛,广受世界各地大学生的喜爱。ACM每年在各大洲会举办区域赛,表现优异的学校将有资格参加世界总决赛。

ACM-ICPC自1996年踏上中国大陆,只在上海大学设立赛点。从2008年开始,每年在中国大陆有五个赛区举办区域赛。BNU也从2002年开始组建了ACM校队,通过老师和同学的不懈努力,BNU的ACM成绩也在逐年进步。

每年BNU校队都会举办一系列的培训以及比赛,吸引优秀的同学参赛(易大神牛为此还搭建了我们学校的神OJ)。校队各项活动的时间大致安排如下:

时间

活动

英文名称

11月-12月

ACM基础培训(面向全校本科生)

Basic Training

12月

新生赛(面向全校本科一年级的同学)

Rookie Contest

2月-4月

春季培训(面向全校学生)

Spring Training

4月

校赛(面向全校本科生和硕士研究生)

BNU Contest

7月

实践周(面向全校本科生)

Practice Week

7月-8月

暑期训练(面向校队)

Summer Training

9月-11月

区域赛(校队)

Regional Contest

小胖是BNU ACM校队的脑残粉,他掌握了校队各项活动的时间,同学们对校队的活动安排有什么疑问都会找他。比如昨天大钰儿问他,校队5月份有什么安排,今天浪哥问他暑假7月份要做什么,等等等等。随着想加入校队的人数越来越多,询问也越来越多,小胖就写了个程序,自动回答这些询问。

Input

输入第一行有一个整数T(1<=T<=100),表示询问的个数。

接下来有T行,每一行一个整数M(1<=M<=12),代表询问的月份M。

Output

对于每一个询问,输出若干行,表示该月的活动,每一行代表一个活动的英文名称。如果某个月有多项活动,则按照上表给出的顺序输出。如果某个月没有活动,则输出一行Unknown。

Sample Input

3
1
11
7

Sample Output

Unknown
Basic Training 
Regional Contest
Practice Week 
Summer Training
little yellow 写的
 
  
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    int T;
    while (~scanf("%d",&T))
    {
        while (T--)
        {
            int M,k=0;
            scanf("%d",&M);
            if (M>=11 && M<=12){
                k++;
                printf("Basic Training\n");
            }
            if (M==12){
                k++;
                printf("Rookie Contest\n");
            }
            if (M>=2 && M<=4){
                k++;
                printf("Spring Training\n");
            }
            if (M==4){
                k++;
                printf("BNU Contest\n");
            }
            if (M==7){
                k++;
                printf("Practice Week\n");
            }
            if (M>=7 && M<=8){
                k++;
                printf("Summer Training\n");
            }
            if (M>=9 && M<=11){
                k++;
                printf("Regional Contest\n");
            }
            if (k==0) printf("Unknown\n");
        }
    }
    return 0;
}

B. 沙漠之旅

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29376

“小胖要穿越一片沙漠,小胖开着一辆大吉普,小胖的吉普油耗高,吉普能放四桶油。”

这就是人人会唱的沙漠之歌~~体现了小胖拔群的聪明才智。

小胖的问题是这样的:现在需要驾车穿越一片沙漠,总的行驶路程为L。小胖的吉普装满油能行驶X距离,同时其后备箱最多能放下四桶油。在起点有N种汽油,每种汽油都有无限桶,一桶能行驶距离Ai。现在小胖想知道:能不能恰好带四桶油,再加上出发前装满的油,使得恰好能行驶L距离。

Input

第一行一个正整数T(1 <= T <= 50),表示数据的组数。

接下来T组数据,每组数据的第一行是三个整数L(1 <= L <= 1000),X(1 <= X <= L),N(1 <= N <= 1000)。

接下来N行,每行一个正整数Ai(1 <= Ai <= 1000),表示第i种汽油一桶能行驶的距离。

Output

对于每组数据输出一行,若能输出“Yes”,否则输出“No”

Sample Input

1
20 9 2
2
3

Sample Output

Yes
Submit  Status  PID: 29376
little yellow and me
思路:
完全背包 判断是否能装到l-x个空间
 
  
#include
#include
#include
#include
using namespace std;

int a[1100];
bool x[1100],y[1100];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int l,x1,n;
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        scanf("%d%d%d",&l,&x1,&n);
        for (int i=0; i=a[i]; j--)
                {
                    if (x[j-a[i]]==1) y[j]=1;
                }
            }
//
//                                        for (int i=0; i<=l; i++)
//                                        printf("%2d ",y[i]);
//                                        printf("\n");
            for (int i=0; i<=l; i++)
            {
                x[i]=y[i];
                y[i]=0;
            }

        }

        if (x[l]==1) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

me:
 
  
#include
#include
#include
#include
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a[1005]={0};
        bool dp[5][1005]={0};

        int l,x,n;
        int i,j,k;

        scanf("%d%d%d",&l,&x,&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);

        l-=x;

        dp[0][0]=1;
        for(int i=1;i<=n;i++)//n钟油
            for(int j=1;j<=4;j++)//四桶
            for(int k=l;k>=a[i];k--)//l-x开始装
            {
                if(!dp[j][k])
                    dp[j][k]=dp[j-1][k-a[i]];
            }
        if(dp[4][l]==true)
            printf("Yes\n");
        else
            printf("No\n");
    }
}

Adidas vs Adivon

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29378

“我们坐在高高的土堆上面,听妈妈讲阿迪王的事情。我出生在一个不太普通的家庭,妈妈会预知术,在我小的时候,妈妈就常跟我说:‘在未来的世界,有一种叫阿迪王的东西成为比石油、黄金还重要的东西……’那时,我痴痴地听着,一听就到半夜,听到入迷,任由鼻涕流到自己的嘴里。长大后,我终于知道阿迪王是什么东西。它是对于亿万人来说比自身生命还重要的神物……”

就我所知,一双普通的阿迪王人造革鞋的日常维护费就很惊人了,有些亿万富翁购买了阿迪王的产品后因为不堪负担产品的日常维护费用而宣布个人破产。

“I'm coming!!!”

但是,Adidas这个从来没有听过的牌子居然告Adivon商标侵权了!!这是Adivon粉丝们不能容忍的!!!所以在一个夜黑风高的晚上,一位高贵的Adivon粉丝与另一位Adidas屌丝约战于华山之巅。作为21世纪的新青年,他们选择了智力对抗,来一局博弈定胜负。

他们拿出了一张长和宽都是正整数的纸片,每次,当前一方可以选择将纸片水平或竖直撕成相等的两半(平行于长边或宽边),扔掉一半。但是要求撕完后剩下的那部分纸片长和宽依旧是正整数。直到有一方不能再撕,该方即输掉这场博弈。

Adivon的粉丝那是相当大度的,所以每次都是Adidas屌丝先手。

Input

第一行一个整数N(2<=N<=2000),表示他们进行了多少局博弈。

接下来N行,每行两个正整数L和H(1<=L,H<=1000000),表示该局纸片的初始长宽。

Output

对于每一局游戏,输出一行,如果Adivon粉丝胜利则输出"Adivon prevails",否则Adivon粉丝将发动神技,改变游戏结局,此种情况输出"Adidas loses".

Sample Input

2
1 2
2 2

Sample Output

Adidas loses
Adivon prevails
Submit  Status  PID: 29378
思路:
太水 撕到撕不了 计算总共能撕几次
单身...偶数....
 
  
#include
#include
#include
#include
using namespace std;
int cnt;
int main()
{
    int a,b;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        cnt=0;
        while(a%2==0)
        {
            a=a/2;
            cnt+=1;
        }
        while(b%2==0)
        {
            b=b/2;
            cnt+=1;
        }
       if(cnt&1)
       printf("Adidas loses\n");
       else
       printf("Adivon prevails\n");

    }
}

F. Taiko taiko

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29140

(2015省赛系列--团体热身赛第二场)_第1张图片

拆拆超级喜欢太鼓达人(赛后大家可自行百度规则),玩久了也对积分规则产生了兴趣,理论上连击数越多,分数增加的越快,而且还配合着击打准确度有相应的计算规则,拆拆觉得这些规则太复杂了,于是把规则自行简化了下:

对于一段击打序列,我们假设Y为打中,N为未打中 (没有良可之分了)

我们视连续的n次击中为n连击  相应的分数为 1+2+3+。。。+n

例如序列YNNYYYNYN的总分数为1+1+2+3+1=8

当然 击中是有概率的 我们假定概率始终为P(0<=P<=1)拆拆的击中概率很高的恩恩=w=

于是现在拆拆想知道对于长度为L的序列  击中概率为P时 获得积分的期望是多少

Input

一个整数T(表示T组数据)

接下来的T组数据

接下来T行 每行一个整数L 一个浮点数P

数据范围

1<=T<=1000

1<=L<=1000

0<=P<=1

Output

对于每组数据输出一行1个6位小数 即题目描述的期望

Sample Input

2
2 0.9
3 0.5

Sample Output

2.610000
2.125000
Submit  Status  PID: 29140
思路:好题 比赛时候算了40多分钟才发现可以用动态做 也是醉了
1*p
1*p*p+28
#include
#include
#include
#include
using namespace std;
double dp[1005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        double p;
        scanf("%d%lf",&n,&p);
//        printf("%lf%d")
        memset(dp,0,sizeof(dp));

        dp[1]=1.0*p;

        for(int i=2;i<=n;i++)
        dp[i]=(dp[i-1]+i)*p;

        printf("%.6lf\n",dp[n]);
    }
}

H. 硬币水题II

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29064

小胖有一个正反面不对称的硬币。如果抛一次这个硬币,它的正面朝上的概率为p,反面朝上的概率为1-p。现在,小胖想用这个硬币来产生等概率的决策(50%对50%)。当然,只抛一次是不行的。小胖的策略是这样的:每一次决策,需要抛硬币两次,如果都是正面朝上或者都是反面朝上,那么就重新再做一次决策;如果是一正一反,那么如果第一次是正面朝上,就说抛了正面,如果第一次是反面朝上,那么就视为抛了反面。这样,就能得到一个公平的决策了。

现在问题是,给定一个p,小胖平均要抛多少次,才能得到一个决策呢(即不用再抛了)?

Input

第一行包含一个整数N(N<=100),表示测试数据的个数。

接下来包括N行,每行一个测试数据,包括一个3位的浮点数p(0

Output

对每一个测试数据,输出一行,包括一个浮点数,表示小胖抛硬币的平均次数。

结果保留两位小数。

Sample Input

3
0.500
0.800
0.300

Sample Output

4.00
6.25
4.76
思路:感觉好丢脸 当时还在推样例
c风一眼看出来 就是p*p的倒数吗 - - 瞬间尿了
 
  
#include
#include
#include
#include
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double a;
        scanf("%lf",&a);
        double b=1-a;
        printf("%.2lf\n",1.0/(a*b));
    }

}

鸣人的查克拉

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Submit  Status  PID: 29065

《火影忍者》中,在忍者们使用忍术的时候,需要一定的查克拉(可以看成是一种体力值)。在战斗前,大家都希望提高自己的查克拉。

鸣人发明了一种忍术,可以在短时间内提高查克拉。

在使用忍术前,鸣人需要做一个仪式,这个仪式决定之后每个时刻的一个查克拉值。这些值的使用规则是:如果在某个时刻发动这个忍术,鸣人需要先消耗该时刻的查克拉值;在某个时候结束这个忍术,鸣人能获得该时刻的查克拉值(忍术必须先发动才能结束)。当然,如果某时刻鸣人具有的查克拉值少于该时刻的查克拉值,那么鸣人是不能发动该忍术的。

由于鸣人对这个忍术还不能很好地控制,所以他最多只能发动两次该忍术,并且两次忍术不能同时发动,也就是说必须结束一次忍术才能发动下一次(第一次结束时可以立即发动第二次)。

现在仪式已经做完了,鸣人知道了自己的查克拉的初始值,以及各个时刻的查克拉值,如果他最多可以发动两次该忍术(他也可以选择发动一次或者不发动),那么他最多能达到的查克拉值是多少?

Input

输入数据只有一组,第一行包括两个整数C(0<=C<=100,000)和N(N<=10,000),表示鸣人的初始查克拉值以及仪式决定的时刻的个数。

接下来有N行,第i行包含一个整数Ai (0<=ai<=100,000),表示第i个时刻的查克拉值。

Output

输出一个整数,表示鸣人在使用忍术后能到达的最大的查克拉值。

Sample Input

Sample Input1
10 5
1
2
3
2
5

Sample Input2
10 2
11
13

Sample Output

Sample Output1
15

Sample Output2
10
Submit  Status  PID: 29065
思路:题意大家一起看了4遍才懂 
当时我想到的方法是动态规划 规划了一个多小时没推出转移方程式
后来听说就是道模拟题 瞬间醉了
 
  
#include
#include
#include
#include
using namespace std;
int main()
{
    int c,n;
    while(~scanf("%d%d",&c,&n))
    {
        int x;
        int c1=c,c2,c3,c4,c5;
        c2=c3=c4=c5=-0xfffff;

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(c1>=x)
                c2=max(c2,c1-x);
                c3=max(c3,c2+x);//第一次消耗最小
            if(c3>=x)//第一次的结果
                c4=max(c4,c3-x);
                c5=max(c5,c4+x);//第二次发动消耗最小
        }
        int res1=max(c3,c5);
        int res2=max(c1,res1);
        printf("%d\n",res2);
    }
}

你可能感兴趣的:((2015省赛系列--团体热身赛第二场))