广西大学“中国东信杯”第三届程序设计竞赛-新生组-部分题解

一、A+++++++++++

题目描述:

有一天,小西的好朋友Antinomy来到西大参观,发现校园里有两副巨大的画,一幅的标题是《创新》,一幅的标题是《创业》,但都是空白的。于是Antinomy问小西:“这两幅画应该是画的什么呀?”小西:“里面是正在从事创新或者创业的同学。”Antinomy:“什么是创新?”小西:“从事高水平科研技术研究和参加高水平学科竞赛,简单来说就是学术活动和技能训练。”Antinomy:“什么是创业?”小西:“基于行业实际发展情况和实时政治经济情况,在有限资本下创立可持续盈利且具有较大发展空间的活动。”小西:“至于为什么这两幅画是空白的,因为同学们都在参加创新创业竞赛。”

众所周知,创新创业类竞赛是我们学校人均参加的重量级竞赛,这一类别的竞赛在评奖评优或推免评比的考核中占据绝对性优势,即所谓的“A+”类竞赛。
但众所周知,之所以A+类竞赛是A+类竞赛,只是因为最高只能是这么多,现在Antinomy想知道,假设没有这个限制,给出竞赛名称冠名的Title集合,请求出这个竞赛的等级。
小西认为,对于给出的nnn个title中,每能组成一对<national,nternational><national,international><national,international>(也就是中国国际),那么竞赛的等级就可以在A的基础上增加一个+。

输入描述

输入第一行为测试用例T,接下来有T组测试数据每组测试用例第一行为一个整数n,表示有n个title,接下来n行每行一个字符串表示第i个title,title只可能是national或者international
1≤T≤100
3≤n≤10^4

输出描述

对于每组测试用例输出此时的竞赛等级

示例
输入

4
3
national
international
national
4
national
international
national
international
4
national
national
national
national
4
international
international
national
national

输出

A+
A++
A
A++

这题就是简单的统计national和international的数量,取两者最小值,即两者最多能组成多少对。

#include<iostream>
#include<string>
using namespace std;
int main ()
{
    
    
	int t;
	cin >> t;
	while ( t-- )
	{
    
    
		int n, book[2] = {
    
     0 };
		cin >> n;
		while ( n-- )
		{
    
    
			string arr;
			cin >> arr;
			if ( arr == "national" )
				book[0]++;
			if ( arr == "international" )
				book[1]++;
		}
		cout << "A";
		for ( int i = 1; i <= min ( book[0], book[1] ); i++ )
			cout << "+";
		cout << endl;
	}

	return 0;
}

二、GDP Carry

题目描述

小西和Antinomy又来到君武楼,这里正在做A+类竞赛校赛的答辩,他们偷偷翻了翻参加答辩的项目组的项目计划书,发现每个计划书都有日流水这样的指标,他们决定做一个游戏。现在有nnn个项目计划书,每个计划书上有一个日流水数字,将这nnn个日流水视为一个长度为nnn的序列fff,两人轮流操作,Antinomy先手,Antinomy每次需要把fff中非空的连续的一段移除,要求这一段的元素和需要为奇数;小西也每次需要把F中非空的连续的一段移除,但是这一段的元素和需要为偶数,如果轮到谁的时候无法操作下去那么这个人就判定为输。移除一段之后,原来这一段之前的部分和原来这一段之后的部分也视为连续。已知他们都会采取最优的策略,给出这nnn个日流水,请问最后谁会赢呢?

输入描述

第一行输入nnn,表示fff的长度,接下来一行nnn个整数分别表示f0,f1·······fn-1
3<=n<=10^6
1<=fi<=10^9

输出描述

输出一行一个字符串表示胜利者,如果Antinomy胜利那么输出Antinomy,否则输出XiJam

示例1
输入

4
1 2 3 4

输出

Antinomy

示例2
输入

3
2 2 4

输出

XiJam

这道题是一个简单的博弈论问题,因为是Antinomy(龙大佬)先手,且只能拿奇数,所以

如果流水和为奇数,那么龙老板可以直接全部拿走,龙老板胜,输出Antinomy
如果流水和为偶数
1.每份流水都是偶数,不管怎么组合,偶数+偶数只能是偶数,所以龙老板必输,输出XiJam
2.有部分流水是奇数,龙老板先手拿走奇数,那么总数=偶数-奇数=奇数,所以Xijam第二手不可能直接全部拿走,只能拿走一个偶数,那么!!奇数-偶数==奇数,所以第三手,龙老板又可以直接全部拿走。

综上分析:只有全部都是偶数,龙老板才能输!

#include<iostream>
using namespace std;
int main ()
{
    
    
	int book=0,n;
	cin >> n;
	long long temp;
	for ( int i = 1; i <= n; i++ )
	{
    
    
		cin >> temp;
		if ( temp % 2 != 0 )
			book = 1;
	}
	if ( book == 1 )
		cout << "Antinomy" << endl;
	else cout << "XiJam" << endl;
	return 0;
}

三、Interpretability

小西和Antinomy在翻A+级比赛答辩的PPT时,发现PPT里列举的诸多指标之间都有相互支撑的关系,他们共同组织成了让评委看起来觉得很厉害同时也能站得住脚的观感。说到站得住脚,众所周知三角形具有良好的稳定性,小西和Antinomy还发现,这一堆PPT列出的指标里,每个指标都有一个可信度。如果任意三个指标的可信度,将其视为长度时能组成一个三角形的话,那么这三个指标就能相互支撑,从而看起来站得住脚。经过整理之后发现,每个指标的可信度都是2的正整数次幂,且可信度为2^i的指标有fi个,只考虑三个指标相互支撑的情况,每个指标只能被用在一个相互支撑的三角形里。现在Antinomy和小西想知道,给定一个数字n,以及n个数字f1,f2,…fnf_1,f_2,…f_nf1​,f2​,…fn​,这些指标最多能形成多少个相互支撑的三角形体系?

输入描述

输入描述输出描述

输出一行一个整数表示最多能形成多少个三角形体系。

示例1
输入

3
1 1 1

输出

0

示例2
输入

5
1 2 2 2 2

输出

3

示例3
输入

3
3 3 3

输出

3

提示

提示:并不是非要把2i2^i2i存下来

首先,根据两边之和大于第三边,我们可以得到,这些值里,任意不相等的三个是不可能组成一个三角形,所以只有等腰或者等边可以考虑。
为什么优先等腰,因为要保证最多,就要尽量用之前的“多余的边角料”!

#include<iostream>
using namespace std;
int main ()
{
    
    
	long long n, f,book=0,ans=0;
	cin >> n;
	while ( n-- )
	{
    
    
		cin >> f;
		
		while( f>=2 && book > 0 )//优先等腰
		{
    
    
			ans++;
			f -= 2;
			book--;
		}
		ans += f / 3;//然后等边
		book += f % 3;
	}
	cout << ans << endl;
	return 0;
}

四、Normalization

本人水平不够,过!

五、小西和数字转换

本人太懒了。。直接链接看题吧
密码:2020gxuacm19
小西和数字转换

这个题,,需要你理解取余的过程,比如n%100,百位以及以上的数字是多少,都不会影响取余的结果,所以只需要考虑百位以下的位置
本体原理相同

#include<iostream>
#include<string>
using namespace std;
int main ()
{
    
    
	string num;
	int n,x,y;
	cin >> n >> x >> y;
	cin >> num;
	int ans = 0;
	for ( int i = n - x ; i < n; i++ )
	{
    
    
		if ( ( num[i] == '1' && i != n - y - 1 ) || ( num[i] == '0' && i == n - y - 1 ) )
			ans++;
	}
	cout << ans << endl;
	return 0;
}

六、小西和拼图

小西和拼图
密码:2020gxuacm19

首先要明白主对角线的概念(这边建议百度)


主对角线明白了这题就比较简单了,只需要有左下跟右上相等的矩形,那么就可以拼出这个题目要求

#include<iostream>
using namespace std;

int temp[2][2];
int main ()
{
    
    
	int t;
	cin >> t;
	while ( t-- )
	{
    
    
		int n, m;
		cin >> n >> m;
		int book = 0;
		for ( int i = 1; i <= n; i++ )
		{
    
    
			cin >> temp[0][0] >> temp[0][1] >> temp[1][0] >> temp[1][1];
			if ( temp[1][0] == temp[0][1] )
				book = 1;
		}
		if ( m % 2 == 0 && book == 1 )
			cout << "YES" << endl;
		else cout << "NO" << endl;
	}
return 0;
}

七、小西和复制粘贴

小西和复制粘贴
密码:2020gxuacm19
这个题思路比较复杂,逆序推导,此处参考了一下lmgg的代码,自己理解吧

#include<iostream>
#include<string>
#define MAX 200005
using namespace std;
int a[MAX], b[MAX], c[MAX];
int main ()
{
    
    
	long long k, m, n;
	string arr;
	cin >> k >> m;
	cin >> arr;
	cin >> n;
	for ( int i = 0; i < n; i++ )
		cin >> a[i] >> b[i] >> c[i];

	for ( int i = 0; i < k; i++ )
	{
    
    
		int p = i;
		for ( int j = n - 1; j >= 0; j-- )
		{
    
    
			if ( c[j] <= p )
			{
    
    
				if ( c[j] + b[j] - a[j] <= p )
				{
    
    
					p -= b[j] - a[j];
				}
				else//超过m裁掉那种
				{
    
    
					p = a[j] + p - c[j];
				}
			}

		}
		cout << arr[p];

	}
	cout << endl;
	return 0;
}

最后把我爆内存的代码贴出来给大家欣赏 以此为戒

#include<iostream>
#include<string>
using namespace std;
int main ()
{
    
    
	string arr;
	long long k, m, n;
	cin >> k >> m;
	cin >> arr;
	cin >> n;
	while ( n-- )
	{
    
    
        string book;
		long long a, b, c;
		cin >> a >> b >> c;
		book = arr.substr ( a, b-a );
		arr.insert ( c, book );
		string Arr = arr.substr ( 0, m );
		arr = Arr;
	}
	for ( int i = 0; i < k; i++ )
		cout << arr[i];
	cout << endl;
	return 0;
}

这次竞赛,除了第四个有亿点点复杂的模拟,和第七个思路比较复杂,第八个dfs需要一定的基础,其余五题作为一个新生做出来应该问题不大。

猜你喜欢

转载自blog.csdn.net/weixin_51550966/article/details/111478544