您的位置:首页 > 其它

南邮2014程序设计新生赛暨蓝桥杯校内自主选拔赛

2014-11-13 23:31 330 查看
南邮2014程序设计新生赛暨蓝桥杯校内自主选拔赛

题目链接: http://acm.njupt.edu.cn/acmhome/contest.do?&method=contestDetail&contestId=213

好奇的奥利安娜

时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte

总提交:333 测试通过:99

描述

发条魔灵奥利安娜,拥有不俗的线上能力与恐怖的团战大招的她以前却一直坐着联盟冷板凳,直到遇到了一位被世人称为宇宙第一中单“中路杀神”的召唤师——龙怨天(Yuantian Dragon)

在某一次比赛中,龙怨天使用奥利安娜共释放了4次大招,造成了爆炸伤害。比赛结束后,他突然想知道4次大招共造成了多少伤害,当然,要是全部空大,那么就完成了发条的终极成就——“四大皆空”;

龙怨天以肉松饼为报酬,请你帮帮他,你能解决吗?

输入

先输入一个正整数T,表示共有T组测试样例(1≤T≤100)

对于每一个测试样例,输入4个整数,第i个数pi,表示第i次大招造成的伤害(0≤pi≤10000)

输出

对于每一个样例,输出4次大招的伤害总值,如果4次大招均未造成伤害,则输出"sidajiekong";

样例输入

2

1 2 3 4

0 0 0 0

样例输出

10

sidajiekong

呵呵

#include <cstdio>
int main()
{
    int n,a,b,c,d;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d%d%d", &a, &b, &c, &d);
        if(a + b + c + d == 0)
            printf("sidajiekong\n");
        else
            printf("%d\n", a+b+c+d);
    }
}


突发奇想的茂凯

Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte

Total Submit:106 Accepted:26

Description

扭曲树精茂凯,英勇无畏的他每次战斗之后都会散落一些树枝,怀旧的他都将其收藏了起来,看做是自己胜利的勋章,已知总共收藏了n根树枝,且第i根树枝长为ai。

有一天,茂凯突发奇想——要是从中选出3根树枝,组成周长尽可能大的三角形,最大的可能周长为多少?

Input

首先输入一个正整数T,表示有T组数据(1≤T≤100)

对于每组数据,先输入一个正整数n,表示茂凯收藏了n根树枝(3≤n≤20)

然后再输入n个正整数,对于第i个数,表示第i根树枝长为ai,(1≤ai≤100000)

Output

对于每组测试数据,输出最大周长三角形的周长,若给出的树枝均无法构成三角形,请输出-1;

Sample Input

2

5

2 3 4 5 10

4

4 5 10 20

Sample Output

12

-1

继续呵呵

#include <cstdio>
#include <algorithm>
using namespace std;
int a[21];

bool cmp(int a, int b)
{
    return a > b;
}

bool judge(int a, int b, int c)
{
    if(a + b > c && a + c > b && b + c > a)
        return true;
    return false;
}

int main()
{
    int T, ma;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        ma = -1;
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        sort(a, a + n, cmp);
        for(int i = n - 1; i >= 0; i--)
            for(int j = i - 1; j >= 0; j--)
                for(int k = j - 1; k >= 0; k--)
                    if(judge(a[i], a[j], a[k]))
                        ma = max(ma, a[i] + a[j] + a[k]);
        printf("%d\n", ma);
    }
}


马尔扎哈的疑惑

Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte

Total Submit:160 Accepted:27

Description

众所周知,虚空先知马尔扎哈的被动技能可以召唤宠物用来辅助战斗,但可惜的是,宠物数量最多只能有3个,显然,这不够强力。

最近,通过马尔扎哈的不懈努力,终于改进了这个技能——他第1秒时只有一个宠物,该宠物每过一秒又可以生出一个新宠物,而新宠物从他出生的第3秒开始,每过一秒也可以生出一个新宠物,新的宠物也以此类推。

请问,在第n秒时,马尔扎哈总共有多少个宠物?

Input

先输入一个正整数T,表示样例个数,1≤T≤100;

对于每一个测试样例,输入一个正整数n,表示第n秒,1≤n≤55。

Output

对于每一个测试样例,输出第n秒时,马尔扎哈拥有的宠物数。

题目保证结果在int范围内。

Sample Input

2

4

5

Sample Output
4

6

呵呵呵

#include <cstdio>
int a[60];
int main()
{
    int n;
    scanf("%d", &n);
    int x;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    for(int i = 4; i <= 100; i++)
        a[i] = a[i - 1] + a[i - 3];
    while(n--)
    {
        scanf("%d", &x);
        printf("%d\n",a[x]);
    }
}


大发明家的童年

Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit:28 Accepted:4

Description

多少年后,当大发明家黑默丁格超神的那一刻,准会想起父亲着带他学习《通信原理》的那个下午;

数字信号是由01构成的数字串,传输数字信号的时候会先经过转码处理然后进行传输,下面给出两种码的说明:

AMI码:信号码中信号0不变,信号1交替变成+1,-1,(这里我们规定第一个1变为-1)

1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 改写成AMI码之后就成为了:

-1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1

HDB3码:检查信息码中连"0"的个数,若连"0"个数小于3,则HDB3码与AMI码完全相同

当出现4个以上连"0"的时候,每4个连"0"变为000V,V的极性与前一个非0码极性相同,

相邻V之间的极性必须相反,所以如果相邻V之间1码的个数为偶数,则后一段000V变为B00V,B的极性与前一个非0码相反,V的极性要与该B相同,同时后面的非0码的极性也要从V码开始再交替变化,即后面的1要根据最后的V的极性进行交替

现在给定一串信息原码,求修改之后的HDB3码。

(顺带一提,出题人绝对不是抱着被通原虐了然后想要虐大家这样邪恶想法才出这道题的,绝对..(^.^))

Input

单组样例,先输入一个正整数n,表示信息原码的长度,4≤n≤100;

接着,输入n个整数,表示由0,1组成的数字表示信息原码的构成。

题目保证第一段4连“0”之前肯定会有1。

Output

输出一行:根据条件分别输出0,-1,+1,+B,-B,+V,-V,互相之间用空格隔开,最后一个码后面不要空格。

Sample Input

18

1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1

Sample Output
-1 0 0 0 -V +1 0 0 0 +V -1 +1 -B 0 0 -V +1 -1

小模拟,暴力模拟

#include <cstdio>
char str[205];
int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    for(int i = 0; i < 2 * n - 1; i++)
        scanf("%c ", &str[i]);
    scanf("%c", &str[2 * n - 1]);
    for(int i = 0; i < n; i ++)
        if(str[i] == '0' && str[i + 1] == '0' && str[i + 2] == '0' && str[i + 3] == '0')
            str[i + 3] = 'V';
    int cnt;
    for(int i = 0 ; i < n; i++)
    {
        cnt = 0;
        for(int j = i + 1; j < n; j++)
        {
            if(str[i] == 'V' && str[j] == 'V')
            {
                for(int k = i; k <= j; k++)
                    if(str[k] == '1')
                        cnt++;
                if(cnt % 2 == 0)
                {
                    str[j - 1] = str[j - 2] = '0';
                    str[j - 3] = 'B';
                }
                break;
            }
        }
    }
    bool flag = true;
    for(int i = 0; i < n - 1; i++)
    {
        if(str[i] == '0')
            printf("%c ", str[i]);
        else
        {
            if(str[i] == '1' && flag)
            {
                printf("-1 ");
                flag = !flag;
            }
            else if(str[i] == '1' && !flag)
            {
                printf("+1 ");
                flag = !flag;
            }
            else if(str[i] == 'V' && !flag)
                printf("-V ");
            else if(str[i] == 'V' && flag)
                printf("+V ");
            else if(str[i] == 'B' && !flag)
            {
                printf("+B ");
                flag = !flag;
            }
            else if(str[i] == 'B' && flag)
            {
                printf("-B ");
                flag = !flag;
            }
        }
    }
    if(str[n-1] == '0')
        printf("0\n");
    else if(str[n-1] == '1' && flag)
        printf("-1\n");
    else if(str[n-1] == '1' && !flag)
        printf("+1\n");
    else if(str[n-1] == 'V' && !flag)
        printf("-V\n");
    else if(str[n-1] == 'V' && flag)
        printf("+V\n");
}


爱魔法的露露

Time Limit(Common/Java):1200MS/4000MS Memory Limit:65536KByte

Total Submit:55 Accepted:7

Description

仙灵女巫露露,对于魔法的热忱可是超出常人,要是发现了什么上古遗留下的魔法,她总是想方设法地获得,然后研究分析。而最近,他又从邪恶小法师维嘉那里获得了一个“奇怪”的魔法卷轴;

这个魔法卷轴上有一大串数字,而且根据卷轴上的描述,这个魔法的威力指数来自于这一串数字中“魔法区间”的数量;

所谓“魔法区间”指的是一段连续的闭区间,且这段区间上的所有数字均不相同;

现在,露露想知道这个魔法的威力指数,你能帮帮她么?

Input

先输入一个正整数T,表示样例个数,1≤T≤10。

对于每一个样例,先输入一个正整数n,表示卷轴上的数字个数(1≤n≤106);

再输入n个整数,第i个数ai,表示卷轴上第i个数(0≤ai≤106)。

Output

对于每个样例,输出一个正整数,即威力指数。

题目保证结果在int范围内。

Sample Input

1

3

1 2 3

Sample Output

6

Hint

读入数据请使用 scanf();

对于样例,共有{1},{2},{3},{1,2},{2,3},{1,2,3},6个魔法区间,所以威力为6。

hash + 线性两点扫

#include <cstdio>
#include <cstring>
int const MAX = 1e6 + 5;
int a[MAX], hash[MAX];
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        memset(hash, 0, sizeof(hash));
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        int ed = 1, st = 1;
        int ans = 0;
        for( ; ed <= n; ed++)
        {
            if(!hash[a[ed]])
                hash[a[ed]] ++;
            else
                break;
        }
        while(st <= n)
        {
            hash[a[st]] --;
            ans += ed - st;
            st++;
            for( ; ed <= n; ed++)
            {
                if(!hash[a[ed]])
                    hash[a[ed]] ++;
                else
                    break;
            }
        }
        printf("%d\n", ans);
    }
}


赵信的往事

Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte

Total Submit:29 Accepted:9

Description

赵信——德玛西亚的总管,可谓一人之下,万人之上。但谁能想到,他以前在诺克萨斯的角斗场过的是怎样的生活?

那时,成千上万的奴隶或战俘被抓进角斗场,通过血腥的杀戮供贵族们取乐。所以,为了活下去,除了自身的实力之外,拉帮结派也是必不可少的。显然,这样的事只可能发生在互相信赖的人的中间,而在当时,人们互相信赖的标准却很奇怪——每个人都有一个编号,若两个人可以相互信赖,那么当且仅当这两个编号的素因子集合相同。

那么问题来了:

现在有三个人想组团,请问他们能相互信赖么?

Input

先输入一个正整数T,表示共有T组测试样例,1≤T≤10000。

对于每一个测试样例,输入三个正整数,对于第i个数pi,表示第i个人的编号(1≤pi≤109)。

Output

对于每组样例,如果可以可以成功组团,则输出“YES”,否则输出“NO”。

Sample Input

2

3 6 9

3 9 27

Sample Output

NO

YES

Hint
对于样例一,6的素因子集合为{2,3},与其他人不同,所以不行;

对于样例二,所有数的素因子集合均为{3},因此可以组团。

无限gcd

#include <cstdio>
#include <algorithm>
using namespace std;
int a[5], flag;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;  
}

void cal(int x,int y)
{
    int tmp;
    if(x == 1 && y == 1) 
        return;
    tmp = gcd(x, y);
    x /= tmp;
    y /= tmp;
    if(x == 1 && y == 1) 
        return;
    else if(tmp == 1 && y % x != 0)
    {
        flag = 0;
        return;
    }
    else
        cal(x, g);
    return;

}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        flag = 1;
        scanf("%d %d %d", &a[0], &a[1], &a[2]);
        sort(a,a+3);
        cal(a[0],a[1]);
        cal(a[1],a[0]);
        if(flag) 
        {
            cal(a[0],a[2]);
            cal(a[2],a[0]);
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: