华东师范 2018年 研究生复试上机题解合集


庙会

庙会

题目大意
是谁带你来看这场庙会
行为掩饰后超越了思维
舞台上的小丑和你的左小腿
别管我,别把我和他们扯在一起
——李志《鸵鸟》
在这里插入图片描述
来到这场庙会,现在需要男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

输入格式
三个整数 m, n, k (1 ≤ \leq m,n ≤ \leq 150,1 ≤ \leq k ≤ \leq 4000),分别表示男士人数、女士人数、几轮舞曲。

输出格式
输出各轮舞曲的配对方案。
输入样例

2 4 6

输出样例

1 1
2 2
1 3
2 4
1 1
2 2

解题思路
两个指针分别指向男和女,到达临界点更新指针的值

#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    int m,n,k,cnt=0;
    scanf("%d%d%d",&m,&n,&k);
    for(int i=1,j=1;cnt<k;i++,j++)
    {
            printf("%d %d\n",i,j);
            if(i==m) i=0;
            if(j==n) j=0;
            ++cnt;
    }
    return 0;
}

热河路

热河路
题目大意
没有人在热河路谈恋爱,
总有人在天亮时伤感
如果年轻时你没来过热河路,
那你现在的生活是不是很幸福
——李志《热河》
在这里插入图片描述
奔跑。跌倒。奔跑。

热河路有一家开了好多年的理发店,不管剪什么样的发型,你只要付五块钱。现在我们来到了热河路。

我们可以将其抽象成一个如下的序列:

110100100010000100000……

请你找出这个无穷序列中指定位置上的数字。
输入格式
第一行一个正整数 n (1 ≤ \leq n ≤ \leq 1500000),表示询问次数。

接下来的 行,每行一个正整数 a i _i i (1 ≤ \leq a i _i i ≤ \leq 10 9 {^9} 9), 表示在序列中的位置。
输出格式
输出 n 行,每行为一个 0 或 1,表示该序列第 a i _i i 位上的数字。
输入样例

4
3
14
7
6

输出样例

0
0
1
0

解题思路
数学的思维,打标代数据这个规律是正确的,至于为什么,我没想明白,数学差hhh,数学啊,要我小命,呜呜呜

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int num;
        scanf("%d",&num);
        int n=sqrt((num-1)*2);
        if(n*(n+1)==(num-1)*2||n*(n-1)==(num-1)*2) cout<<1<<'\n';
        else cout<<0<<'\n';
    }
    return 0;
}

用STL里面的 set ,然后用 find()函数在集合中查找,如果找到就输出1,否则输出0。 find()函数的时间复杂度是O(logN),最好的情况的O(1),基于红黑树的原理。 孩子不会红黑树呜呜呜,丢了大学生的脸本蒟蒻的代码,欢迎参考学习啦~~

#include <cstdio>
#include <set>
using namespace std;
set<int>st;
int n,a;
int main()
{
    for(int k=0,i=1; i<=1e9 ; )
    {
        st.insert(i);
        ++k;
        i+=k;
    }
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&a);
        if(st.find(a)!=st.end()) puts("1");
        else puts("0");
    }
    return 0;
}

定西

定西
题目大意
这么多年你一个人一直在走
方向和天气的节奏会让你忧愁
你说你遇见了一大堆奇怪的人
他们看上去好像都比你开心
——李志《定西》
在这里插入图片描述
这首歌的吉他节奏总感觉是在致敬《加州旅馆》,前奏又像葫芦娃里面在蛇精洞是的配乐
一个人走走了很多年,发现自己走到了一个很长的,年久失修的楼梯面前。年久失修的意思就是,有 k 个台阶坏了,没法走。

楼梯一共有 n 层,你一次能上一阶、两阶或三阶台阶,请问,你从楼梯底部 ( 0 开始) 走到楼梯顶部,共有多少种走法。
输入格式
输入数据共两行,第一行包含两个自然数 n (1 ≤ \leq n ≤ \leq 100) 和 k (0 ≤ \leq k < n),第二行包含 k k k 个自然数 X i X_i Xi (1 ≤ \leq x x x ≤ \leq n n n),数字之间用一个空格隔开,表示损坏的台阶的序号(从楼梯底部到楼梯顶部,台阶序号依次为 1 到 n n n)。
输出格式
输出数据仅包含一个整数,表示所有可行走法的总数。
输入样例

5 2
2 4

输出样例

2

解题思路
初始化, d p [ 0 ] dp[0] dp[0] = 1;第二个阶梯是坏的, d p [ 1 ] dp[1] dp[1]=0,否则 d p [ 1 ] dp[1] dp[1] = d p [ 0 ] dp[0] dp[0],第三个台阶是坏的, d p [ 2 ] dp[2] dp[2]=0,否则 d p [ 2 ] dp[2] dp[2] = d p [ 0 ] dp[0] dp[0] + d p [ 1 ] dp[1] dp[1],最后确定状态转移方程 d p [ n ] dp[n] dp[n] = d p [ n − 3 ] dp[n-3] dp[n3] + d p [ n − 2 ] dp[n-2] dp[n2] + d p [ n − 1 ] dp[n-1] dp[n1];

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100+5;
int f[N]={0},g[N]={0};
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;++i)
	{
		int x;
		cin>>x;
		g[x]=1;
	}
	f[0]=1;
	if(g[1]==1)f[1]=0;
	else f[1]=f[0];
	if(g[2]==1)f[2]=0;
	else f[2]=f[0]+f[1];
	for(int i=3;i<=n;++i)
	{
		if(g[i]==1)continue;
		f[i]=f[i-1]+f[i-2]+f[i-3];
	}
	cout<<f[n]<<endl;
	return 0;
}

和你在一起

和你在一起
题目大意
我想和你在一起
直到我不爱你
宝贝 人和人 一场游戏
我愿意为你死去
如果我还爱你
宝贝 反正活着 也没意义
宝贝 我也只能 这样为你
——李志《和你在一起》
在这里插入图片描述
现场4分10秒,小哥跟着逼哥嘶吼,泪流满面。我要和你在一起,直到我不爱你。有这么 n 个数字,联成一排拼到一起便是我爱你的时间,那么我们会在一起多久呢

例如: n = 3 时,3 个整数 13,312,343 联接成的最长时间为: 34331213。
又如: n = 4 时,4 个整数 7,13,4,246 联接成的最长时间为: 7424613。
输入格式
n (1 ≤ \leq n ≤ \leq 20),表示 n 个数。

接下来一行 n n n 个正整数,大小不超过 1e 4 {^4} 4
输出格式
拼成的最长时间。
输入样例

3
623 583 413

输出样例

623583413

解题思路
一看数据,直接字符串来个冒泡排序,数据小可以暴力做,比较第一个字符串的第一个字符,相等就比较下一位,否则得出排序结果。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
string s[30];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;++i) cin>>s[i];
    for(int i=2; i<=n ;++i){
        for(int j=1;j<i;j++){
            for(int k=0;k<=4;){
                if(s[j][k]<s[i][k]){
                    string ss="";
                    ss=s[i];
                    s[i]=s[j];
                    s[j]=ss;
                }
                if(s[j][k]==s[i][k]) ++k;
                else break;
            }
        }
    }
    for(int i=1;i<=n;++i) cout<<s[i];
	return 0;
}

梵高先生

梵高先生
题目大意
谁的父亲死了
请你告诉我如何悲伤
谁的爱人走了
请你告诉我如何遗忘
——李志《梵高先生》
在这里插入图片描述
2009年的最后一天 在义乌隔壁酒吧 李志为了还做唱片欠下来的20W 巡回35场演出 在这晚完成 喝醉了的逼哥哽咽着唱完梵高先生 说最后一次唱这歌。他粗鲁的打断了大家的合唱,然后用最沙哑的嗓音唱了起来,哪天,唯一和他合音的只有一只狗。

抬头再看了一眼星空和黑夜,今晚的星星变成了一个三角形的样子,像这样:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

现在给你一个正整数 n,请你给出星空的前 n 行。

输入格式
输入文件共一行,包含一个正整数 n (1 ≤ \leq n ≤ \leq 20)。
输出格式
输出文件共 n 行,即星空的前 n 行。每行包含若干正整数,这些正整数之间用一个空格隔开(不能有多余的空格),最后一个正整数后面没有空格。
输入样例

4

输出样例

1
1 1
1 2 1
1 3 3 1

解题思路
水题, d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j-1] + dp[i-1][j] dp[i][j]=dp[i1][j1]+dp[i1][j]

#include <iostream>
using namespace std;
int dp[50][50];
int main()
{
    int n;
    cin>>n;
    dp[1][1]=1;
    for(int i=2;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
            if(j==1 || j==n) dp[i][j]=1;
            else dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=i;j++)
        {
            if(j==1) cout<<dp[i][j];
            else cout<<" "<<dp[i][j];
        }
        cout<<endl;
    }
    return 0;
}

西班牙馅饼

西班牙馅饼
题目大意
港岛妹妹,你献给我的西班牙馅饼
甜蜜地融化了我,天空之城在哭泣
港岛妹妹,我们曾拥有的甜蜜的爱情
疯狂地撕裂了我,天空之城在哭泣

——李志《天空之城》
在这里插入图片描述

粉丝问:“我想问一下在你歌词里面的馅饼是什么?”

李志答:“告诉你,西班牙馅饼是怎么一回事。是有一次我一个朋友给我寄了一张明信片,从西班牙寄过来的,明信片的封面是一块馅饼,谢谢你,你惊讶吗?你们惊讶吗?想想啥?你们知道个几把?整天瞎几把猜对不对?挺可笑的。所以答案一公布就这个样子。你再回想一下生活里面有多少个这样的事情,你充满了幻想,充满了好奇,猜哦,瞎几把猜,猜到后面傻逼了吧?没猜到了吧?”

现在我们看见了这个西班牙馅饼长什么样,西班牙馅饼是个矩形形状,想不到吧。我们可以把它抽象成一个 N 行 M 列的正整数矩阵。每个格子有一个“美味值”,由于一些不可告人的原因我们对于这个馅饼没行只能吃一口,港岛妹妹说如果她吃到美味值为 k 的馅饼,就会给我做出美味值为 k 的红烧肉。问红烧肉最多能有多好吃。
输入格式
N,M:表示 N 行 M 列,馅饼的尺寸大小。

以下 N 行 M 列为馅饼每个格子的美味值。

输入中所有数是不超过 100 的正整数。

输出格式
一个正整数,表示红烧肉最多能有多好吃。

输入样例

3 2
8 15
11 4
2 43

输出样例

69
#include <iostream>
using namespace std;
int main()
{
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=0;i<n;++i)
    {
        int maxx=-0x3f3f3f3f,t;
        for(int j=0;j<m;++j)
        {
            cin>>t;
            if(t>maxx) maxx=t;
        }
        ans+=maxx;
    }
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉聊信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值