USACO 2021 January Contest, BronzeProblem 3. Just Stalling题解

题目描述

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。所有的高度和高度限制均在范围 [1,10^9] 内。

输出格式(输出至终端/标准输出):

输出 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 没有额外限制。

供题:Shreyas Thumathy

要求与思路:

1. 将n头奶头放进n间牛棚内,保证奶牛的高度不超过牛棚的高度,计算一共有多少种方法?

2. 排序后,最高的奶牛受限最多,我们从最高的奶牛开始计算,每头奶牛可以有多少间牛棚可以选择,将所有奶牛的选择性乘起来就是答案。

3. 当前这头牛,可以住在大于等于自己身高的牛棚里,当然需要排除掉其他牛已经占据的牛棚,同时,最高的牛我们自然也安排住进最高的牛棚里。

知识点:

贪心、排序、排列组合

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long ans = 1;
int a[30], b[30], flag[30];//flag标记当前第i个牛棚是否用过 
int main(){
	int n;
	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 + n + 1);
	sort(b + 1, b + n + 1);
	//从高到矮,记录每头牛有几间牛棚可选 
	for(int i = n; i >= 1; i--) {
		int cnt = 0;
		for (int j = n; j >= 1; j--){
			if (flag[j] == 0 && b[j] >= a[i]){
				cnt++;
			}
		}
//		cout << "cnt " << cnt << endl;
		//从高到矮安排牛棚入驻 
		for (int k = n; k >= 1; k--){
			if (flag[k] == 1)continue;
			else {
				flag[k] = 1;
				break;
			}
		}
//		for (int m = 1; m <= n; m++)cout << "flag[m] " << flag[m] << " ";
//		cout << endl;
		ans *= cnt;
	}
	cout << ans;
	return 0;
}

思考:

1. 这场月赛三道题目,第三题反而比较简单,看起来USACO也并不完全是按照难度对题目进行排序的。

2. 一开始以为得用快速幂结果不是,N最多才20,乘起来不超过longlong,所以还是比较友好的一道排列题目

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值