1.15 USACO铜组测试2 (21 Jan Contest)

T1奶牛唱歌

问题描述

一个鲜为人知的事实是,奶牛拥有自己的文字:「牛文」。牛文由 26 个字母 ‘a’ 到 ‘z’ 组成,但是当奶牛说牛文时,可能与我们所熟悉的 ‘abcdefghijklmnopqrstuvwxyz’ 不同,她会按某种特定的顺序排列字母。

为了打发时间,奶牛 Bessie 在反复哼唱牛文字母歌,而 Farmer John 好奇她唱了多少遍。

给定一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母,计算 Bessie 至少唱了几遍完整的牛文字母歌,使得 Farmer John 能够听到给定的字符串。Farmer John 并不始终注意 Bessie 所唱的内容,所以他可能会漏听 Bessie 唱过的一些字母。给定的字符串仅包含他记得他所听到的字母。

输入格式

输入的第一行包含 26 个小写字母 ‘a’ 到 ‘z’ 的牛文字母表顺序。下一行包含一个小写字母组成的字符串,为 Farmer John 听到 Bessie 唱的字母。字符串的长度不小于 1 且不大于 1000。

输出格式

输出 Bessie 所唱的完整的牛文字母歌的最小次数。

输入样例

abcdefghijklmnopqrstuvwxyz
mood

输出样例

3

样例说明

在这个样例中,牛文字母表与日常的字母表的排列一致。

Bessie 至少唱了三遍牛文字母歌。有可能 Bessie 只唱了三遍牛文字母歌,而 Farmer John 听到了以下被标记为大写的字母。
abcdefghijklMnOpqrstuvwxyz
abcdefghijklmnOpqrstuvwxyz
abcDefghijklmnopqrstuvwxyz

测试点性质

测试点 2-5 中,牛文字母表与日常的字母表相同。
测试点 6-10 没有额外限制。

思路

将每个顺序做一个代数进行比较,因为不会有重复的,看有多少个后面的小于等于前面的即可

代码

#include <bits/stdc++.h>
using namespace std;

map <char , int> mp;
string s , st;

int main(){
	cin >> s >> st;
	for(int i = 0; i < s.size(); ++i)
		mp[s[i]] = i;
	int ans = 1;
	for(int i = 0; i < st.size() - 1; ++i)
		if(mp[st[i + 1]] <= mp[st[i]])
			ans++;
	cout << ans << endl;
	return 0;
} 

T2照片分组

问题描述

Farmer John 正再一次尝试给他的 N 头奶牛拍照(2≤N≤1000)。

每头奶牛有一个范围在 1…100 之内的整数的「品种编号」。Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。

Farmer John 可以分成的最大组数是多少?

输入格式

输入的第一行包含 N。下一行包含 N 个空格分隔的整数,为 N 头奶牛的品种编号。

输出格式

输出 Farmer John 的照片中的最大组数。可以证明,至少存在一种符合要求的分组方案。

输入样例

7
1 3 5 7 9 11 13

输出样例

3

样例说明

在这个样例中,以下是一种分成最大组数三组的方案。将 1 和 3 分在第一组,5、7 和 9 分在第二组,11 和 13 分在第三组。

输入样例

7
11 2 17 13 1 15 3

输出样例

5

样例说明

在这个样例中,以下是一种分成最大组数五组的方案。将 2 分在第一组,11 分在第二组,13 和 1 分在第三组,15 分在第四组,17 和 3 分在第五组。

思路

因为偶数加偶数等于偶数,偶数加奇数等于奇数
奇数加奇数等于偶数,奇数加偶数等于偶数
分为以下几种情况

1 .奇数和偶数个数相同 , 可以直接配对输出个数

2 .偶数个数大于奇数,先把每个奇数配一个偶数,因为偶数和偶数相加只能是偶数,所以可以有下一组的偶数但是构不成奇数,偶数加上去是不影响数字的奇偶性的,所以把剩下的数字加到前面即可,不影响答案

3 . 奇数的个数大于偶数,先将每一个偶数和一个奇数配对,
两个奇数相加是一个偶数,如果剩下的奇数是三的倍数,每三个奇数配成两组,如果除以三余二剩下的便可以合成一个偶数进行下一组,
如果余一就只能抽出两个奇数合成一个偶数加到前面的数字中剩下的奇数个数就余二了,同上

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 10;

int n , even , odd , ans;

int main(){
	cin >> n;
	int temp;
	for(int i = 1; i <= n; ++i){
		cin >> temp;
		if(temp % 2)
			odd++;
		else
			even++;
	}
	if(even == odd)
		cout << even + odd << endl;
	else if(odd > even){
		ans = 2 * even;
		odd -= even;
		if(odd == 1)
			ans--;
		else{
			if(odd % 3 == 0)
				ans += 2 * (odd / 3);
			else if(odd % 3 == 1){
				odd -= 2;
				ans += 2 * (odd / 3);
				ans++;
			}
			else{
				ans += 2 * (odd / 3);
				ans++;
			}
		}
		cout << ans << endl;
	}
	else{
		cout << 2 * odd + 1 << endl;
	}
	return 0;
} 

T3牛舍安排

问题描述

Farmer John 有 N 头奶牛(1≤N≤20),高度为 a1…aN。他的牛栏有 N 个牛棚,高度限制分别为 b1…bN(例如,如果 b5=17,那么一头高度不超过 17 的奶牛可以住在牛棚 5 里)。Farmer John 有多少种不同的方式安排他的奶牛,使得每头奶牛均住在不同的牛棚里,并且使得每个牛棚的高度限制均得到满足?

输入格式

输入的第一行包含 N。

第二行包含 N 个空格分隔的整数 a1,a2,…,aN。

第三行包含 N 个空格分隔的整数 b1,b2,…,bN。所有的高度和高度限制均在范围 内。

输出格式

输出 Farmer John 可以将每头奶牛安排到不同的牛棚里,使得每个牛棚的高度限制均得到满足的方法数。注意输出的数量可能需要使用 64 位整数型,例如 C++ 中的 long long。

输入样例

4
1 2 3 4
2 4 3 4

输出样例

8

样例说明

在这个例子中,我们不能将第三头奶牛安排到第一个牛棚里,因为 3=a3>b1=2。类似地,我们不能将第四头奶牛安排到第一或第三个牛棚里。一种符合高度限制的安排方式为将奶牛 1 安排到牛棚 1,奶牛 2 安排到牛棚 2,奶牛 3 安排到牛棚 3,奶牛 4 安排到牛棚 4。

测试点性质

测试点 1-5 满足 N≤8。
测试点 6-12 没有额外限制。

思路

将奶牛和牛棚都排个序,将每个奶牛可以住的牛棚用数组存储一下,
因为从后往前每个奶牛可以住的牛棚都会随着前面奶牛住的个数而减小,每个奶牛可以住的牛棚减去大于它的奶牛个数,用乘法原理乘一下即可

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 110;
#define int long long

int n , a[MAXN] , b[MAXN] , c[MAXN];

signed main(){
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> a[i];
	for(int i = 1; i <= n; ++i)
		cin >> b[i];
	sort(a + 1 , a + 1 + n);
	sort(b + 1 , b + 1 + n);
	for(int i = 1; i <= n; ++i){
		int temp = 0;
		for(int j = 1; j <= n; ++j)
			if(a[i] <= b[j])
				temp++;
		c[i] = temp;
	}
	for(int i = 1; i <= n; ++i)
		c[i] -= (n - i);
	int ans = 1;
	for(int i = 1; i <= n; ++i)
		if(c[i] > 0)
			ans *= c[i];
	cout << ans << endl;
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
USACO Train测试数据是用于评估和训练美国计算机奥林匹克竞赛(USACO)参赛学生计算机编程能力的一系列数据集。这些测试数据包含多个问题和相应的输入和输出样例,学生需要根据题目要求编写程序来解决问题,并通过测试数据来验证程序的正确性。 USACO Train测试数据的目的是让参赛学生熟悉比赛中的常见问题类型,并提供高质量的测试样例来帮助学生评估自己的解决方案。测试数据通常会涵盖广泛的主题,包括算法,数据结构,动态规划等。 参赛学生可以使用USACO Train测试数据进行自我评估和训练。在提交解答之前,学生可以使用测试数据来测试自己的程序,确保其正确性。通过与测试数据相比较,学生能够检测出潜在的错误和边界情况,提高自己的解决问题的能力和编程技巧。 USACO Train测试数据是参赛学生的重要资源,可以帮助他们更好地准备比赛。通过不断练习和尝试解决测试数据中的问题,学生能够提高自己的编程能力,解决实际问题的能力和思维灵活性。 总之,USACO Train测试数据是提供给参赛学生的一系列用于训练和评估计算机编程能力的测试样例。这些测试数据能够帮助学生熟悉比赛常见问题类型,并提供高质量的测试样例来衡量解决方案的正确性。通过使用这些测试数据,学生可以提高自己的解决问题的能力和编程技巧,更好地准备和参加USACO竞赛。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值