哈尔滨理工大学第七届程序设计竞赛初赛(低年级组)

链接:https://www.nowcoder.com/acm/contest/28/A
来源:牛客网

这套题虽然简单,但是几乎每道题都有需要我注意的知识点,引以为戒。

题目描述
这是mengxiang000和Tabris来到幼儿园的第一天,mengxiang000和Tabris一见面就很投缘,mengxiang000先说一句话,Tabris就会紧接着说一句话。如果mengxiang000说的是lansou,那么Tabris就会紧接着说xianggu、相反,如果mengxiang000说的是xianggu、那么Tabris就会紧接着说lansou。
输入描述:
第一行输入一个整数t,表示一共的测试数据组数。
每组数据输入一行,包含一个字符串,表示mengxiang000所说的话。
1<=t<=10
输出描述:
每组数据输出一行,包含一个字符串,表示Tabris所说的话。
示例1
输入

2
lansou
xianggu
输出

xianggu
lansou

#include <iostream>
#include<cstring>
using namespace std;
char a[50];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {

        cin>>a;
        if(strcmp(a,"lansou")==0)//要注意的就是strcmp函数的用法 返回值为0表示两个字符创相等
            cout<<"xianggu"<<endl;
        else
            cout<<"lansou"<<endl;

    }

    return 0;
}

链接:https://www.nowcoder.com/acm/contest/28/C
来源:牛客网

题目描述
这是mengxiang000和Tabris来到幼儿园的第三天,Tabris在幼儿园每天都吃的很饱,小小年纪就胖成了W斤,mengxiang000笑话他腿粗,这让Tabris是非常难受,立志想要减肥,就在QQ上更改了他的网名以立誓铭志(不廋到120斤不改名)

他给自己定了一个计划,每天都减T斤,他想知道,他多少天后就能修改QQ网名(小于等于120斤都算是廋到了120斤)。
输入描述:
第一行输入一个整数t,表示一共的测试数据组数。
每组测试数据包含两个数,W,T,表示Tabris现在的体重,以及每天计划减少T斤
t<=100
1<=W<=100000
1<=T<=100000
输出描述:
每组数据输出一行,表示多少天后Tabris就可以更改网名了。
示例1
输入

2
128 7
1450 2
输出

2
665

#include<iostream>
using namespace std;
int N,M,K;
int main()
{
    int W,T;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>W>>T;
        if(W<=120)//虽然不符合题意 但是看W的范围 不要落掉这一点
           cout<<0<<endl;
        else if((W-120)%T==0)
            cout<<(W-120)/T<<endl;
        else
            cout<<(W-120)/T+1<<endl;
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/28/E
来源:牛客网

题目描述
今天是Tabris和mengxiang000上幼儿园的第5天了。
美丽的老师教了一个非常简单的知识——加法运算。
最后在黑板上写下一些数,让同学们计算这些数的加和,对于刚刚学完加法的Tabris自然是so easy。但是对于IQ卡待充值的mengxiang000来说,真的太难了,于是mengxiang000来向你求助,你能帮帮他么?
输入描述:
本题有T组数据。
每组数据有一行数字。
1≤T≤200
1≤数字个数≤1000
1≤数字大小≤100000
输出描述:
输出每行数的和,并换行。
示例1
输入

2
1 2 3 4 5 6
1 3 5
输出

21
9

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    long long int  sum = 0;
    int T;
    cin>>T;
    int m;
    char k;
    while(T--)
    {
        sum = 0;
        cin>>m;
        while(scanf("%c",&k))
         {
           sum+=m;
           if(k=='\n')break;
           cin>>m;
         }
        cout<<sum<<endl;
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/28/F
来源:牛客网

题目描述
今天是Tabris和mengxiang000来到幼儿园的第6天,美丽的老师在黑板上写了几个数字:121,11,131,聪明的Tabris一眼就看出这些数字是那样的神奇——无论是正着写还是反着写都是一样的,mengxiang000想要得到更多的这样有趣的数,又因为这是二人到幼儿园的第6天,6+2=8。他们想知道长度为8的这样的数都有哪些。但是写着写着机智的Tabris发现这样神奇的数实在太多了,所以向你求助,你能帮帮他们吗?
输入描述:

输出描述:
从小到大输出所有符合题意的数,每个数占一行。
示例1
输入

none
输出

none

#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{

    for(int i = 1000;i<=9999;i++)
    {

       cout<<i;
       int m = i;
       for(int j=0;j<4;j++)
       {
         cout<<m%10;
         m/=10;
       }
       cout<<endl;

    }
    return 0;
}

本来想用一下数字和字符串的转换函数,在dev中编译成功,但是在牛客网上提交显示编译有问题,可能是平台问题。

#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
 //char a[4];作为全局变量 定义为char a[4]则没事?
int main()
{
    char a[5];//作为局部变量 如果定义为char a[4],则没有位置存放‘\0’导致越界

    for(int i = 1000;i<=9999;i++)
    {

       cout<<i;
       itoa(i,a,10);
       strrev(a);//记住字符串逆置函数strrev()
       cout<<a<<endl;

    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/28/G
来源:牛客网

题目描述
今天是Tabris和mengxiang000来到幼儿园的第9天。
为了庆祝这美好的一天,老师组织同学们做游戏,拿来了好多骰子。
游戏规则:
1)两个人每人轮流掷骰子,操控同一个小人在一个有向的地图上走,骰子的点数是几,这个小人就向前走几格。
2) 地图只有一条路,路上有起点、终点和传送阵。传送阵会只能传送到最近接终点的另一个传送阵的位置上,否则传送阵势不会发动。
3)只要路过传送阵就会被传送走、并继续走完应走的步数,一个传送阵作为入口或出口只能使用一次。
4)小人到达终点时最后一个掷骰子的人获胜,且游戏结束。
Tabris与mengxiang000这两个傻孩子,并没有弄懂规则,就在一边轮流掷骰子玩了。
现在给你这张地图,和Tabris与mengxiang000总共掷骰子的次数与每次骰子的点数,你知道他俩应该谁赢么?(Tabris先掷骰子)
为了简化问题,‘S’代表起点、‘E’代表终点、‘@’代表传送阵、‘.’代表普通作为路的格子。
输入描述:
本题有T组数据
每组数据第一行有一行字符串代表地图。
第二行包含一个整数N,代表Tabris与mengxiang000总共掷骰子的次数。
第三行帮扩N个整数a_i ,代表每次的点数。
1≤地图长度≤10000
1≤T≤200
1≤N≤200
1≤a_i≤6
输出描述:
如果小人到达终点,输出赢家的名字,否则输出None。
示例1
输入

2
S…@…..@….E
3
6 6 6
S..@..E
3
6 6 6
输出

mengxiang000
Tabris
说明

从传送门的入口进入到出口出去相当于走了一格。

对于第一组样例:

箭头所示位置为小人所在的位置

这道题要注意两个地方:1.想当然的以为字符串以S打头,E结尾,实则不然
2.注意题目最后的提示,从传送门的入口进入到出口出去相当于走了一格

/*
3
S...@.....@....E
3
6 6 6
S..@..E
3
6 6 6
....S...@......@...@....@..E
2
2 6
*/
#include <iostream>
#include<cstring>
using namespace std;
char map[10005];
int first,last,total,sum;
int start;
int dest;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(map,0,sizeof(map));
        cin>>map;
        for(int i = 0;i<strlen(map);i++)//根据样例,想当然的以为字符串以S打头,E结尾,实则不然
        {
            if(map[i]=='S')
                start = i;
            if(map[i]=='E')
                dest = i;//库里有end()同名函数 所以不能用做变量 
        }
        正向找到最开始的@
        for(int i = start;i<strlen(map);i++)
        {
            if(map[i]=='@')
            {
                first = i;
                break;
            }
        }
        //逆向找到最后面的@
        for(int i = dest;i>=0;i--)
        {
            if(map[i]=='@')
            {
                last = i;
                break;
            }
        }
        total = first+dest-start-last+1;//注意题目最后的提示,从传送门的入口进入到出口出去相当于走了一格
        int N;
        cin>>N;
        int flag = 1;
        sum = 0;
        for(int i = 0;i<N;i++)//之前写的for(int i = 0;i<N&&sum<total;i++)这样边读边判断导致输入的数不够N个 而影响后面样例
        {
            int m;
            cin>>m; sum += m;
            if(sum<total) flag++;
        }
        if(sum<total)cout<<"None"<<endl;
        else if(flag%2==0)cout<<"mengxiang000"<<endl;
        else cout<<"Tabris"<<endl;
    }
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/28/H
来源:牛客网

题目描述
这是mengxiang000和Tabris来到幼儿园的第七天,mengixang000发动了一个魔法阵,能够召唤出来两只逗逼兽.每只逗逼兽都有自己的名字,而且两只逗逼兽的名字长度是相同的,逗逼兽是要成对出现的才有战斗力,其战斗力是根据其名字而决定的,如果其中一只的名字是s,另外一只的名字为t,那么其战斗力为:
n-1 n-1
Σ Σ F(shift(s,i),shift(t,j));
i=0 j=0
shift(s,i)表示是以字母s[i]开头的字符串.
例如:
shift(ACC,0)=ACC
shift(ACC,1)=CCA
shift(ACC,2)=CAC
F(字符串A,字符串B)=字符串A和字符串B对应相同位子上相同字母的个数和,现在已知两只逗逼兽的名字,求其战斗力。
例如,如果某只逗逼兽的名字是ACC,另一只逗逼兽的名字是ACG那么这两只逗逼兽的战斗力的值就是:
F(ACC,ACG)+F(ACC,CGA)+F(ACC,GAC)+
F(CCA,ACG)+F(CCA,CGA)+F(CCA,GAC)+
F (CAC,ACG) +F(CAC,CGA)+F(CAC,GAC)
=2+0+1+1+2+0+0+1+2=9。
输入描述:
第一行输入一个整数t,表示一共的测试数据组数。
每组数据输入两行,每行输入一只逗逼兽的名字,保证两只逗逼兽的名字长度相同,保证输入的字符都是大写字母。
t<=100
1<=逗逼兽的名字的长度<=100000
输出描述:
每组数据输出一行,包含一个整数,表示两只逗逼兽的战斗力。 (保证输出结果在2^60以内)
示例1
输入

1
ACC
ACG
输出

9

这道题是看了其他人的题解发现其实很简单。
可以考虑为ACCACC 和ACGACG 每次从不同的起点向后取3个字母,所以每个字母将依次在第一个位置,第二个位置。。。第N个位置。所以只要t中有和s一样的字符,那么一定存在一种情况两字符在同一位置。 所以只需统计一下s串中每个字母出现的次数,再看t中出现的字母在s总出现的次数,相加即为每确定一个s串的状态,t串的三个状态中满足条件的个数,再乘len即可,因为长度为len的字符串就有len种排列方法。

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int l[30];//用来记录每个字母出现的次数
char s[100005];
char b[100005];
int len;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long  ans = 0;
        memset(l,0,sizeof(l));
        memset(b,0,sizeof(b));//不明白为什么这个字符数组命名为t就不可用 显示编译错误
        memset(s,0,sizeof(s));
        cin>>s;
        cin>>b;
        len = strlen(s);
        for(int i = 0;i<len;i++)
        {
            l[s[i]-'A']++;
        }
        for(int i = 0;i<len;i++)
        {
            ans+=l[b[i]-'A'];
        }
        cout<<ans*len<<endl;
    }
    return 0;
}

这是之前没有发现这个规律时的枚举,超时。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
string ss;
string tt;
char s[200005];
char t[200005];
int len;
string shift(string s,int i );
int main()
{

    int T;
    cin>>T;
    while(T--)
    {
        int cnt = 0;
        cin>>s;cin>>t;
        //strcat(s,s);
        //strcat(t,t);strcat(char*,const char*) 第二个变量应为常量 strcat(s,"avd");
       len = strlen(s);
     //  cout<<len<<endl;

        for(int i = len,j = 0;i<2*len;i++,j++)
        {
            s[i] = s[j];
        }
        for(int i = len,j = 0;i<2*len;i++,j++)
        {
            t[i] = t[j];
        }
    //  cout<<s<<' '<<t<<endl;
        for(int i = 0;i<len;i++)
        {
            ss = shift(s,i);
        //  cout<<ss<<endl;
            for(int k = 0;k<len;k++)
            {
                tt = shift(t,k);

            //  cout<<tt<<endl;
                for(int j = 0;j<len;j++)
                {
                    if(ss[j]==tt[j])cnt++;
                }
            //  cout<<cnt<<endl;
            }

        }
        cout<<cnt<<endl;
    }
    return 0;
}
string shift(string s,int i)
{
    string ss = s.substr(i,i+len-1);
    return ss;

}

链接:https://www.nowcoder.com/acm/contest/28/I
来源:牛客网

题目描述
今天是Tabris和mengxiang000来到幼儿园的第3天,mengxiang000接到了一个布置会场的任务。
他需要将贵宾观众席的椅子排成一排,一共需要N个。
幼儿园只有两种椅子,所以他也只能使用两种椅子。(A类型和B类型)并且假设每种椅子的数量都是无限的。
而其如果想要摆置一个B类型的椅子,对应就需要必须有连续两个一起布置。换句话说,就是如果出现了B类型的椅子,其必须且只有两个连着B类型的椅子。
mengxiang000突然想知道对应N个椅子排成一列,他能够有多少种布置的方式.
输入描述:
本题包含多组输入第一行输入一个整数t,表示测试数据的组数
每组测试数据包含一行,输入一个整数N,表示一共需要摆放的椅子数量
t<=30
1<=N<=30
输出描述:
每组测试数据输出包含一行,表示一共有多少种布置的方式。
示例1
输入

2
2
4
输出

2
5
说明

第一个样例,AA,BB两种方案。
第二个样例,AAAA,BBBB,AABB,ABBA,BBAA五种方案 对于ABBB 因为有连续3个B类型椅子所以不可行

开始我的想法就是用模拟,发现每当满足a==N时返回后,紧接着的dfs(a+1,2)或者dfs(a+2,2)语句又将进入一次dfs,使cnt每次都多算一次,所以最后除以二。深搜写的不是很好

#include<iostream>
using namespace std;
int t;
int N;
int chair[35];
int cnt;
void dfs(int a,int b);
int main()
{
    cin>>t;
    while(t--)
    {
        cnt = 0;
        cin>>N;
        dfs(0,1); //1代表A 2代表B
        dfs(0,2);
        cout<<cnt/2<<endl;
    }
    return 0;
}
void dfs(int a,int b)
{
    if(a==N)
    {
        cnt++;
        return ;
    }
    chair[a] = b;
    if(b == 1)
    {
        dfs(a+1,1);
        dfs(a+1,2);
    }
    if(b == 2&&a<N-1)
    {
        chair[a+1] = b;
        dfs(a+2,1);
        dfs(a+2,2);
    }
    return ;

}

参考了别人的代码之后,才发现满足斐波那契数列,神奇

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int a[31];
    a[0]=1,a[1]=1;
    for(int i=2;i<31;i++)
        a[i]=a[i-1]+a[i-2];
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        printf("%d\n",a[n]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值