NEUQ-ACM-招新赛(补题)

7-1 Win

为了实现建设世界一流大学和建设世界一流学科的目标,不少大学都用各种方式提升排名:发表论文、 申请基金、提升多样性. . . 不过看起来这些并不容易,而且 US News 和 Times 这样的机构并不一定会 公正评判你的工作。因此,一些大学更聪明——自己发布排行榜,这可以使得自己的名次间接变好。比如,通过上海某大学发布的软科排名(ARWU)作为桥梁,咖波甚至可以论证他的小汤河职业技术学院要好于清华大学:
 

现在,给定三个大写字母,你需要判断:

如果这三个大写字母分别为:NEU,则输出:Win

如果这三个大写字母分别为:THU,则输出:Lose

否则输出:?

输入格式:

一行三个大写字母,如题意所示

输出格式:

一行一个字符串,如题意所示

输入样例1:

 NEU

 输出样例1:

Win

输入样例2:

THU

输出样例2:

Lose

输入样例3:

KFC

输出样例3:

?

代码长度限制

16 KB

时间限制

1000 ms

内存限制

128 MB

题解: 

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

    string abc;
    cin >> abc;
    if (abc == "NEU") {
        cout << "Win";
    }
    else if (
        abc == "THU") {
        cout << "Lose";
    }
    else {
        cout << "?";
    }


    return 0;
}

7-2 比大小

知名数学家田所浩二先生证明了:

9>10

证明:写下两个数的十进制表示:

9​.

1​0

观察这两个数字从前到后第一个不相同的数字,由于9>1,因此9>10。

用同样的方法,我们可以很容易地证明1919>114514:

19​19..

11​4514

或者是999>99:

99.​

999​

现在,请你给田所浩二先生写一个程序,用来比较两个输入的数字。

输入格式:

第一行一个整数T(1≤T≤106) ,表示有T组数据

接下来T行,每行两个整数a,b(1≤a,b≤109)

输出格式:

输出总共T行,对于第i行:

如果"a>b",则输出:>

如果"a=b",则输出:=

如果"a<b",则输出:<

输入样例:

5
9 10
114514 1919
999 99
131 131
1314 520

输出样例:

>
<
>
=
<

提示:

为避免输出超时,请使用cout << "\n"替代cout << endl

代码长度限制

16 KB

时间限制

2000 ms

内存限制

128 MB

题解: 

#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int cl(int e) {
    int z = 0;
    for (; e > 0;) {
        e = e / 10;
        z++;
    }
    return z;
}
int main() {
    long long int a = 0;
    cin >> a;
    for (int b = 0; b < a; b++) {
        long long int c, d;
        cin >> c >> d;
        if (c == d) {
            cout << "=\n";
        }
        else {
            int e = cl(c);
            int f = cl(d);
            d = d * pow(10, e - f);
            if ((c - d) > 0)
            {
                cout << ">\n";
            }
            else {
                cout << "<\n";
            }
        }
    }
    return 0;
}

7-3 矩阵乘法

Alice在学线性代数。她觉得线代的计算特别麻烦,于是就来找你,希望你可以给她写一个程序计算两个矩阵的乘积。

矩阵乘法介绍:
矩阵A是一个N行P列的矩阵。
矩阵B是一个K行M列的矩阵。
当P=K时,A和B可以相乘(仅限于AB, BA不一定可行)
假设矩阵C=AB,那么Ci,j​=∑t=1P(或K)​Ai,t​∗Bt,j​

举个例子,假设A是一个2×3的矩阵,B是一个3×2的矩阵,最终结果C是一个2×2的矩阵,如下图所示

输入格式:

输入共一行,有三个整数N,P,M(N,P,M≤100)。表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵。

接下来N行,每行P个整数,读入矩阵A。

再接下来P行,每行M个整数,读入矩阵B。

数据保证在输入输出数据可以用int类型存储。

输出格式:

输出N行M列的矩阵C。每行最后一个数后面有一个空格。

输入样例:

在这里给出一组输入。例如:

3 3 3
1 3 2
1 0 0
1 2 2
0 0 2
7 5 0
2 1 1

输出样例:

在这里给出相应的输出。例如:

25 17 4 
0 0 2 
18 12 4 

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

 

#include <iostream>
using namespace std;

int main()
{
	int n,p,m;
	cin >> n >> p >> m;
	int a[100][100],b[100][100],c[100][100]={0};
	for(int i = 0;i < n;i++){
		for(int j = 0;j < p;j++){
			cin >> a[i][j];
		}
	}
	for(int i = 0;i < p;i++){
		for(int j = 0;j < m;j++){
			cin >> b[i][j];
		}
	}
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			for(int k = 0;k < p;k++){
				c[i][j] += a[i][k] * b[k][j];
			}
		}
	}
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			cout << c[i][j] << " ";
		}
		cout << "\n";
	}
	return 0;
}

7-4 疯狂星期四

已知2022年10月11日是星期二

现在给定你一个日期,你需要计算当天是星期几。

输入格式:

一行三个整数M,D,Y,表示所求日期为:M月D日,Y年

1600≤Y≤2400,保证输入日期均为合法日期。

输出格式:

输出一个数字,表示当前是星期几。

如果星期天,则输出0。

输入样例1:

8 17 1926

输出样例1:

2

输入样例2:

2 29 1904

输出样例2:

1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 

#include<iostream>
using namespace std;
int hanshu(int z,int cha,int year,int yue,int ri,int constyear=2000) {
	int pingnianshu=0;
	int tianshu = 0;
	if (year == constyear) {


	}
	else {
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			z -= 1;
		}
		 pingnianshu = cha - z;
		 tianshu = pingnianshu * 365 + z * 366;
		
	}	
	switch(yue) 
	{	
	case 12:
		tianshu +=30;
	case 11:
		tianshu +=31;
	case 10:
		tianshu +=30;
	case 9:
		tianshu +=31;
	case 8:
		tianshu +=31 ;
	case 7:
		tianshu +=30 ;
	case 6:
		tianshu +=31 ;
	case 5:
		tianshu +=30 ;
	case 4:
		tianshu +=31;
	case 3:
		tianshu +=28;
	case 2:
		tianshu +=31;
	case 1: 
		break;
	}
	tianshu += ri;
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
		if (yue > 2) { tianshu += 1; }
	}	
	tianshu -= 1;
	return tianshu;	
}
int hanshu2(int z, int cha, int year, int yue, int ri, int constyear = 2000) {
	int pingnianshu = 0;
	int tianshu = 0;	
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
		z -= 1;
	}
    pingnianshu = cha - z;
    tianshu = pingnianshu * 365 + z * 366;
	switch (yue)
	{
	case 1:
		tianshu +=31 ;
	case 2:
		tianshu +=28 ;
	case 3:
		tianshu +=31 ;
	case 4:
		tianshu +=30 ;
	case 5:
		tianshu +=31 ;
	case 6:
		tianshu +=30;
	case 7:
		tianshu +=31 ;
	case 8:
		tianshu +=31 ;
	case 9:
		tianshu +=30 ;
	case 10:
		tianshu +=31 ;
	case 11:
		tianshu +=30 ;
	case 12:
		tianshu +=31 ;
		break;
	}
	tianshu -= ri;
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
		if (yue < 3) { tianshu += 1; }
	}
	tianshu += 1;
	return tianshu;
}
int hanshu3(int year,int cha,int z,int yue,int ri,int constyear=2000) {
	if (year >= constyear) {
		cha = year - constyear;
		int tishen1 = year;
		for (; tishen1 >= 2000; tishen1--) {

			if ((tishen1 % 4 == 0 && tishen1 % 100 != 0) || tishen1 % 400 == 0) {
				z++;
			}
		}
		int tianshu = hanshu(z, cha, year, yue, ri);
		return  tianshu;
	}
	else {
		cha = constyear - year;
		int tishen2 = year;
		for (; tishen2 <= 2000; tishen2++) {

			if ((tishen2 % 4 == 0 && tishen2 % 100 != 0) || tishen2 % 400 == 0) {
				z++;
			}
		}
		z -= 1;
		cha -= 1;
		int tianshu = hanshu2(z, cha, year, yue, ri);
		return tianshu;
	}
}
int main()
{
	int z = 0;
	int year, yue, ri;
	cin  >> yue >> ri>> year;
	int cha=0;
	int constyear = 2000;
	int tishen = year;
	int tianshu =hanshu3(year, cha, z, yue, ri );
	int yvshu = tianshu % 7;
	if (year >= constyear) {
		switch (yvshu) {
		case 0:
			cout << 6 << endl;
			break;
		case 1:
			cout << 0 << endl;
			break;
		case 2:
			cout << 1 << endl;
			break;
		case 3:
			cout << 2 << endl;
			break;
		case 4:
			cout <<3 << endl;
			break;
		case 5:
			cout << 4<< endl;
			break;
		case 6:
			cout << 5 << endl;
			break;
		}

	}
	else {
		switch (yvshu) {
		case 0:
			cout << 6 << endl;
			break;
		case 1:
			cout << 5 << endl;
			break;
		case 2:
			cout << 4 << endl;
			break;
		case 3:
			cout << 3 << endl;
			break;
		case 4:
			cout << 2<< endl;
			break;
		case 5:
			cout << 1 << endl;
			break;
		case 6:
			cout << 0 << endl;
			break;
		}
	}
	

	
	return 0;
}

7-5 排列

给你一个长度为n的排列p1​,p2​,p3​,...,pn​(1≤pi​≤n,且对于任意i=j,都有pi​=pj​)

再给你一个整数k,每次操作的定义如下:

选定一个下标j(1≤j≤n−k+1),记m=max{pj​,pj+1​,...,pj+k−1​},然后令pj​,pj+1​,...,pj+k−1​的值都等于m。

你需要使用最少的操作次数,使得p中所有元素的值都等于n。

输入格式:

第一行两个整数n,k (2≤n≤106,2≤k≤n)

接下来一行n个整数,用空格隔开,分别表示p1​,p2​,...,pn​

输出格式:

一行一个整数,表示最小的操作次数。

输入样例:

6 3
1 6 4 2 3 5

输出样例:

3

样例解释:

第一次操作选择:j=1,操作后p为:6 6 6 2 3 5

第二次操作选择:j=3,操作后p为:6 6 6 6 6 5

第三次操作选择:j=4,操作后p为:6 6 6 6 6 6

代码长度限制

16 KB

时间限制

1000 ms

内存限制

128 MB

 

#include<iostream>
using namespace std;
int main()
{
	int b, c;
	cin >> b >> c;
	int a[b];
	for (int d = 0; d < b; d++) {
		cin >> a[d];
	}
	int* p=&a[0];
	for (int e = 0; e < b-1; e++) {
		p = &(*p > a[e + 1] ? *p : a[e + 1]);
	}
	int changdu = sizeof(a)/4;
	int qiandizhi = (long long int)p - (long long int)a;
	int qian = qiandizhi/4;
	int zuidadizhi = qian + 1;
	int hou = changdu -qiandizhi/4-1;
	int cishu;
	int shengyv;
	if(qian<=c-1||hou<=c-1){
			if ((changdu - c) % (c - 1) == 0) {
				shengyv = (changdu - c) / (c-1);
			}
			else {
				shengyv = (changdu - c) / (c - 1)+1;
			}
			cishu = shengyv + 1;
	}
	else {
		if (qian%(c-1)==0|| hou % (c - 1) == 0) {
			if (qian % (c - 1) == 0) {
				int qianshengyv = (zuidadizhi - 1) / (c - 1);
				if((changdu - zuidadizhi)%(c-1)==0){
					shengyv = (changdu - zuidadizhi)/(c-1);
				}
				else {
					shengyv = (changdu - zuidadizhi) / (c - 1)+1;
				}
				cishu = qianshengyv + shengyv;
			}
			else {
				int houshengyv = (changdu-zuidadizhi) / (c - 1);
				if ((zuidadizhi-1) % (c - 1) == 0) {
					shengyv = ( zuidadizhi-1) / (c - 1);
				}
				else {
					shengyv = (zuidadizhi - 1) / (c - 1) + 1;
				}
				cishu = houshengyv + shengyv;
			}
	    }
		else {
			if ((changdu-1) %(c - 1)==0) {
				cishu = changdu / (c - 1);
			}
			else {
				cishu = changdu / (c - 1) + 1;
			}

		}
	}
	cout << cishu;
	return 0;
}

 

7-6 小步点

现在是跑步时间。

咖波需要依次经过地图上的五个点位才能完成任务,为了节省体力,他希望以最短的距离跑完这五个点位。

现在给出这五个点位的坐标,你需要帮咖波求出最短距离。(咖波可以从任意一个坐标开始跑步)

输入格式:

总共五行

第i行有两个整数xi​,yi​(−103≤xi​,yi​≤103),表示第i个点位的坐标值。

数据保证不存在坐标相同的点。

输出格式:

输出一个实数,表示最短的跑步距离(保留三位小数)

输入样例:

0 0
0 2
2 2
2 0
1 1

输出样例:

6.828

样例解释:

可选择从(0,0)点开始,依次经过(0,2),(1,1),(2,0),(2,2)

此时距离为:2+2​+2​+2=6.828,可以证明这是最短的路径。

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;

double hanshu1(int a, int b, int c, int d) {
	int x = pow(a - b, 2) + pow(c - d, 2);
	double xx = sqrt(x);
	return xx;
}
double hanshu2(int b[5][2]) {
	double xxx = 0;

	for (int bbb = 0; bbb < 4; bbb++) {
		
		xxx+=hanshu1(b[bbb][0], b[bbb+1][0], b[bbb][1], b[bbb + 1][1]);
	}
	
	return xxx;
}
int main()
{
	int a[5][2];
	int b[5][2];
	for (int b = 0; b < 5; b++) {
		cin >> a[b][0] >> a[b][1];
	}
	double xxxx[150];
	int i = 0;
	for (int a1 = 0; a1 < 5; a1++) {
		for (int a2 = 0; a2 < 5; a2++) {
			if (a1 == a2) {
				continue;
			}
				for (int a3 = 0; a3 < 5; a3++) {
					if (a1 == a3 || a2 == a3) {
						continue;
					}
					
				        for (int a4 = 0; a4 < 5; a4++) {
							if (a1 == a4 || a2 == a4 || a3 == a4) {
								continue;
							}
						           int a5 = 10 - a1 - a2 - a3 - a4;
									for (int a6 = 0; a6 < 2; a6++) {
										b[0][a6] = a[a1][a6];
										b[1][a6] = a[a2][a6];
										b[2][a6] = a[a3][a6];
										b[3][a6] = a[a4][a6];
										b[4][a6] = a[a5][a6];										
									}						  
									
									xxxx[i] = hanshu2(b);
									i++;														
						}										
				}
			
		}
}
	/*0 0
	0 2
	2 2
	2 0
	1 1*/

	sort(xxxx, xxxx + i);
	cout << setiosflags(ios::fixed) << setprecision(3) <<xxxx[0];
	return 0;
}

 

 

7-7 原神生日会

注:空、荧、派蒙均为游戏原神里的人名。

有a个空(男旅行者)和b个荧(女旅行者)在会场外排队参加原神生日会。不幸的是,会场里只有N个座位,而且已经有若干个派蒙(可以是0个)已经坐在会场里面了。

  • 每个男旅行者都希望坐在他边上的是女旅行者或者派蒙。
  • 每个女旅行者都希望坐在她边上的是男旅行者或者派蒙。

换句话说,男旅行者不希望和其他男旅行者坐一起,女旅行者不希望和其他女旅行者坐一起。

如果会场内没有符合旅行者心意的位置,那么旅行者会选择不参加原神生日会。

作为活动组织者的你,希望能参加生日会的旅行者尽可能的多,现在给出会场内每个派蒙的位置,请你求出最多有几个旅行者会来参加生日会。

输入格式:

输入共两行。
第一行有三数,分别为N,a,b(1≤n≤2∗105,0≤a,b≤2∗105,a+b>0)。表示会场内有N个位子,会场外有a个男旅行者,有b个女旅行者。

第二行是一个由字符"."和字符"P"组成的字符串。

"."表示空位,"P"表示这个位置被派蒙占了。

输出格式:

输出一个整数,表示最多可以有几个旅行者参加生日会。

输入样例:

在这里给出一组输入。例如:

11 3 10
.P....PP.P.

输出样例:

在这里给出相应的输出。例如:

7

样例解释

我们用P来表示派蒙,A来表示男旅行者,B来表示女旅行者,最终会场内的座位情况是这样的:BPABABPPAPB

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

 

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int zuoweishu, nan, nv, kongwei, yi, qian, hou,jieguo;
	yi = 0;
	qian = 0;
	hou = 0;
	cin >> zuoweishu >> nan >> nv;
	int nann = 0;
	int nvv = 0;
	string zuowei;
	cin >> zuowei;
	for (int e = 0; e < zuoweishu; ) {
		if (zuowei[e] == 'P') {
			e++;//碰到派蒙,跳过
		}
		else if (zuowei[e] == '.')
		{
			kongwei = 0;
			for (; e < zuowei.size() && zuowei[e] == '.'; e++) {
				kongwei++;
			}
			qian = (kongwei + 1) / 2;
			hou = kongwei - qian;
			if (qian != hou) {
				yi++;
			}
			nann += qian;
			nvv += hou;
		}
	}
	jieguo = min(nann, nan) + min(nv, nvv);
	for (int e = 0; e < yi; e++) {
		nann--; nvv++;
		jieguo = max(jieguo, min(nann, nan) + min(nv, nvv));
	}
	cout << jieguo;
	system("pause");
	return 0;
}

 

 

7-8 漏字文

有意避免使用某个或某几个特定字母的写成的文章称漏字文(英语lipogram,希腊语lipagrammatos,意为“失踪的字母”),漏字文可能在写作或文字游戏中出现。公元前5世纪希腊诗人里斐奥多鲁斯(Tryphiodorus)写的24卷史诗中,每一卷都省略希腊字母中的一个不同字母。

现在给你一段仅由空格和小写字母组成的字符串,请你找出其中最长的一段连续的漏字文,并输出漏字文的长度(即该段文字中字母的个数)。

输入格式:

输入共两行。
第一行一个数N(1≤N≤105),表示有N个由小写字母组成的单词。
第二行是一个字符串,有N个长度不超过10的单词,每个单词间用一个空格隔开。

输出格式:

一个整数,表示漏字文的长度。

输入样例:

在这里给出一组输入。例如:

9
the quick brown fox jumps over the lazy dog

输出样例:

在这里给出相应的输出。例如:

32

样例解释

“the quick brown fox jumps over the lazy dog”包含了所有的字母。
其中最长的漏字文是“the quick brown fox jumps over the lazy”,长度是32(即里面有32个字母)。这段文字没有字母d和g,符合漏字文的条件。

代码长度限制

16 KB

时间限制

1000 ms

内存限制

256 MB

#include <iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int qujian[205];
string a[1000000];
int main() {
    int geshu;
    int houyi = 0;
    int size = 0;
    int zongchangdu = 0;
    int zimugeshu = 0;
    int zuizhongjieguo = 0;
    cin >> geshu;
    for (int e = 0; e < geshu; e++)
    {
        cin >> a[e];
    }
    for (int e = 0; e < geshu; e++) {
        size = a[e].size();
        for (int ee = 0; ee < size; ee++) {
            if (qujian[a[e][ee]] == 0) {
                zimugeshu++;
            }
            qujian[a[e][ee]] += 1;
        }
        zongchangdu += size;
        if (zimugeshu == 26) {
            
            for (; zimugeshu == 26;) {
                size = a[houyi].size();
                for (int eee = 0; eee < size; eee++) {
                    qujian[a[houyi][eee]] -= 1;
                    if (qujian[a[houyi][eee]] == 0) {
                        zimugeshu--;
                    }
                }
                houyi++;
                zongchangdu -= size;
            }
        }
        zuizhongjieguo = max(zuizhongjieguo, zongchangdu);
    }
    cout << zuizhongjieguo;
    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

唏嘘南溪

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值