第二届“图灵杯”NEUQ-ACM程序设计大赛(个人赛)

问题 A: Start up(1)!

时间限制: 1 Sec   内存限制: 64 MB
提交: 710   解决: 479
[ 提交][ 状态][ 讨论版]

题目描述

很高兴你能参加一年一度的NEUQ ACM程序设计竞赛。
只要A了这道题就有机会拿奖哦!快来拼手速A了我!

输入

输出

一段字符串

样例输入

样例输出

I am a NEUQ ACMER.


代码:
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    printf("I am a NEUQ ACMER.\n");
    return 0;
}


B题

问题 B: Start up(2)!

时间限制: 1 Sec   内存限制: 2 MB
提交: 1232   解决: 160
[ 提交][ 状态][ 讨论版]

题目描述

很高兴你能参加一年一度的NEUQ ACM程序设计竞赛。
只要A了这道题就有机会拿奖哦!快来拼手速A了我!

给出一个长度为n(n>1)的数组a,数组中的每个数都不相同,如果存在某个下标i满足

a[i]<a[i+1]                               i=0

a[i-1]>a[i]&&a[i]<a[i+1]           0<i<n-1

a[i]<a[i-1]                                i=n-1

则输出"YES",否则输出"NO".

输入

第一行一个整数N(1<N<=200000),表示数组有N个数.
第二行包含N个数,表示数组中每一项的值M.两个正整数之间会有一个空格,且0<=M<=2^31-1.

输出

如果满足上述条件输出"YES",否则输出"NO".

样例输入

6
6 1 2 3 5 4

样例输出

YES


内存给的有点少,用的类似滚动数组的思路
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int sign=0;
        int a[3];
        if(n==1)
        {
            scanf("%d",&a[0]);
            printf("NO\n");
            continue;
        }
        if(n==2)
        {
            for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
            if(a[2]<a[1])
            printf("YES\n");
            else
            printf("NO\n");
            continue;
        }
        scanf("%d%d",&a[0],&a[1]);
        for(int i=2;i<n;i++)
        {
           scanf("%d",&a[2]);
           if(sign)
           continue;
           if(a[1]<a[2]&&a[1]<a[0])
           {
               sign=1;
           }
           if(i==n-1)
           {
               if(a[1]<a[2])
               sign=1;
           }
           a[0]=a[1];
           a[1]=a[2];
        }
        if(sign)
        printf("YES\n");
        else
        printf("NO\n");
    }
    return 0;
}

C题

问题 C: Digit Chains

时间限制: 10 Sec   内存限制: 64 MB
提交: 524   解决: 59
[ 提交][ 状态][ 讨论版]

题目描述

很高兴你能参加一年一度的NEUQ ACM程序设计竞赛。
只要A了这道题就有机会拿奖哦!快来拼手速A了我!

将一个数字n的每一位平方后相加可以得到一个新的数字,如此重复便可得到数字n对应的数字链。
例如:
27-53-34-25-29-85-89
15-26-40-16-37-58-89
你会发现如果在运算过程中得到数字1或89那么数字链可以无限循环下去。现在给定一个范围,你需要算出有多少数字最终可以得到89.

注:数字89本身不算入结果

输入

范围n
n≤10000000

输出

可以得到89的数字个数

样例输入

5

样例输出

4


直接模拟
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[10];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int ans=0;
        for(int i=2;i<=n;i++)
        {
            if(i==89)
            continue;
            int x=i;
            while(1)
            {
                if(x==1)
                break;
                if(x==89)
                {
                    ans++;
                    break;
                }
                int temp=0;
                while(x)
                {
                    int y=x%10;
                    temp=temp+y*y;
                    x=x/10;
                }
                x=temp;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

G题

问题 G: Trouble in Java

时间限制: 1 Sec   内存限制: 64 MB
提交: 174   解决: 60
[ 提交][ 状态][ 讨论版]

题目描述

越越最近听说Java写代码很方便,便开始学习用Java来刷题。但是Java对大小写很敏感,经常因为手误而编译失败,而且越越还不会用自动完成来提高正确率。你能帮助她排除错误吗?

输入

单个测试样例:改正前的Java代码

输出

改正后的Java代码
注意:为方便起见,引号里的字符串也一并修改。

关键词转换列表:
system->System
scanner->Scanner
string->String
math->Math
tolowercase->toLowerCase
touppercase->toUpperCase

样例输入

public class Test
{
	public static void main(string[] args)
	{
		system.out.println("Java Program");
	}
}

样例输出

public class Test
{
	public static void main(String[] args)
	{
		System.out.println("Java Program");
	}
}

提示


直接字符处理

代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
    string s;
    while(getline(cin,s))
    {
        int n=s.size();
        string s1;
        int i=0;
        for(;i<n;i++)
        {
            if(s[i]!=' '&&i!=n-1&&(s[i]>='a'&&s[i]<='z'))
            s1.push_back(s[i]);
            else
            {
                if((i==n-1)&&(s[i]>='a'&&s[i]<='z'))
                s1.push_back(s[i]);
                if(s1=="system")
                {
                    printf("System");
                }
                else if(s1=="scanner")
                {
                    printf("Scanner");
                }
                else if(s1=="string")
                {
                    printf("String");
                }
                else if(s1=="math")
                {
                    printf("Math");
                }
                else if(s1=="tolowercase")
                {
                    printf("toLowerCase");
                }
                else if(s1=="touppercase")
                {
                    printf("toUpperCase");
                }
                else
                {
                    cout<<s1;
                }
                if((i==n-1)&&(s[i]>='a'&&s[i]<='z'))
                ;
                else
                printf("%c",s[i]);
                s1.clear();
            }

        }
        printf("\n");
    }
    return 0;
}

H题

问题 H: Fill The Bag

时间限制: 2 Sec   内存限制: 64 MB
提交: 551   解决: 47
[ 提交][ 状态][ 讨论版]

题目描述

一次yyf和cq相约去北京比赛,但是想带的东西太多,于是他们决定从要带的东西当中选取一些使得背包尽可能的装满,现在你已经知道了背包的容量和每件物品的体积,你能预计出背包最小的剩余空间吗?

输入

第一行为背包的容量v,接下来的一行为物品的个数n,接下来的n行为每件物品的体积

v≤100000,n≤25

输出

背包最少剩余的空间

样例输入

41
6
8
4
6
2
9
10

样例输出

2


很裸的01背包
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[200000];
int main()
{
    int n,v;
    while(~scanf("%d",&v))
    {
        memset(a,0,sizeof(a));
        a[0]=1;
        int x;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            for(int j=v;j>=x;j--)
            {
                if(a[j-x])
                a[j]=1;
            }
        }
        int ans;
        for(int j=v;j>=0;j--)
        {
            if(a[j])
            {
                ans=v-j;
                break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

I题

问题 I: 反对称串

时间限制: 5 Sec   内存限制: 16 MB
提交: 107   解决: 27
[ 提交][ 状态][ 讨论版]

题目描述

  有一个字符串只有0和1组成,对于某个子串,如果将0和1互换并且倒过来与原子串相同,则认为该子串是"反对称"的.给出一个长度为N的字符串,那么有多少个子串是"反对称"的?

输入

第一行一个正整数N(0<=N<=10000).

第二行包括一个长度为N的01串.

输出

输出"反对称"子串的个数.

样例输入

8
11001011

样例输出

7

提示

这7个"反对称"子串分别是001011,0101,1100出现一次,01和10都出现两次,共7个.


反对称串关于中心反对称,就可以找到中心的那个串,即01或10串,可以通过这两个串向两边拓展,两边的两个也要相反。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[11000];
int main()
{
    char c;
    int n;
    while(~scanf("%d",&n))
    {
        getchar();
        for(int i=1;i<=n;i++)
        {
            scanf("%c",&c);
            a[i]=c-'0';
        }
        int ans=0;
        for(int i=1;i<n;i++)
        {
            if(a[i]==((a[i+1]+1)%2))
            {
                ans++;
                int j,k;
                for(j=i-1,k=i+2;j>=1&&k<=n;j--,k++)
                {
                    if(a[j]==(a[k]+1)%2)
                    ans++;
                    else
                    break;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

J题

问题 J: Letters Only

时间限制: 1 Sec   内存限制: 64 MB
提交: 590   解决: 91
[ 提交][ 状态][ 讨论版]

题目描述

Coffin是一个热爱读书的Geeker。一天他在网上下载了一本PDF的电子书,发现文字里夹杂了许多非英文字符和数字,Coffin一边说这都什么玩意儿,一边开始coding想去除电子书里的非英文字符和数字。

输入

一段字符串

输出

去除非英文字符、标点、数字,保留英文字符、空格、换行符。

样例输入

Th哇is is a sim嘛ple bo嘛ok
.A.C.M.大法好!

样例输出

This is a simple book
ACM


代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
char s[110000];
int main()
{
    while(gets(s))
    {
        int n = strlen(s);
        for(int i=0;i<n;i++)
        {
            if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')||(s[i]==' '))
            printf("%c",s[i]);
        }
         printf("\n");
    }
    return 0;
}



你可能感兴趣的:(Algorithm,编程,ACM)