首页 > 其他分享 >USACO 喂饱奶牛

USACO 喂饱奶牛

时间:2024-09-12 21:20:16浏览次数:5  
标签:更赛 草地 GHHGG USACO 测试用例 喂饱 奶牛

题目背景

时/空限制:1s / 64MB

题目描述

Farmer John 有 N 头奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。

她们沿水平方向排成一行,奶牛们占据的位置编号为 1…N 。

由于奶牛们都饿了,FJ 决定在 1…N 中的某些位置上种植草地。

更赛牛和荷斯坦牛喜欢不同类型的草,所以如果 Farmer John 决定在某个位置种草,他必须选择种植更赛牛喜欢的草或荷斯坦牛喜欢的草——他不能在同一个位置同时种两种草。

种植的每一片草地都可以喂饱数量不限的相应品种的奶牛。

每头奶牛愿意移动至多 K (0≤K≤N−1 )个位置以前往一个草地。

求出喂饱所有奶牛所需种植的最小草地数量。

此外,输出一种使用最小草地数量喂饱所有奶牛的种植方案。

任何满足上述条件的方案均视为正确。

输入格式

每个测试用例包含 T 个子测试用例,每个用来描述一种奶牛的排列。

输入的第一行包含 T 。以下是 T 个子测试用例。

每个子测试用例的第一行包含 N 和 K 。

第二行包含一个长度为 N 的字符串,其中第 i 个字符表示第 i 头奶牛的品种(G 表示更赛牛,H 表示荷斯坦牛)。

输出格式

对于 T 个子测试用例中的每一个,输出两行。

第一行输出喂饱所有奶牛所需的最小草地数量。

第二行输出一个长度为 N 的字符串,表示一种使用最小草地数量喂饱所有奶牛的种植方案。第 i 个字符表示第 i 个位置,若不种草则为 .,若种植喂饱更赛牛的草则为 G,若种植喂饱荷斯坦牛的草则为 H。

任何合法的方案均可通过。

输入输出样例

输入 #1复制

6
5 0
GHHGG
5 1
GHHGG
5 2
GHHGG
5 3
GHHGG
5 4
GHHGG
2 1
GH

输出 #1复制

5
GHHGG
3
.GH.G
2
..GH.
2
...GH
2
...HG
2
HG

说明/提示

数据范围
1≤T≤10 ,
1≤N≤10^5 ,
0≤K≤N−1
样例解释
注意对于某些子测试用例,存在多种可通过的方案使用最小数量的草地。例如,在第四个子测试用例中,以下是另一个可以通过的答案:

.GH..

这个方案在第二个位置种植一块喂饱更赛牛的草地以及在第三个位置种植一块喂饱荷斯坦牛的草地。这使用了最小数量的草地并确保了所有奶牛都在她们喜欢的草地的 3 个位置以内。

AC代码:

 

#include <bits/stdc++.h>
using namespace std;
int t, n, k;
char cow[100005] = {0}, ans[100005];
int main() {
	cin >> t;
	for (int i = 1; i <= t; i++) {
		int cnt = 0;
		memset(ans, '.', sizeof(ans));
		cin >> n >> k;
		for (int j = 1; j <= n; j++) {
			cin >> cow[j];
		}
		int mark = 1;
		while (mark <= n) {
			if (cow[mark] == 'G') {
				if ((mark + k) < n) {
					ans[mark + k] = 'G';
					mark = mark + 2 * k + 1;
				} else {
					ans[n] = 'G';
					break;
				}
			} else mark++;
		}
		int mark2 = 1;
		while (mark2 <= n) {
			if (cow[mark2] == 'H') {
				if ((mark2 + k) < n) {
					ans[mark2 + k] = 'H';
					mark2 = mark2 + 2 * k + 1;
				} else {
					if (ans[n] == 'G') {
						ans[n - 1] = 'H';
						break;
					} else {
						ans[n] = 'H';
						break;
					}
				}
			} else mark2++;
		}
		for (int i = 1; i <= n; i++) {
			if (ans[i] != '.') cnt++;
		}
		cout << cnt << endl;
		for (int i = 1; i <= n; i++) {
			cout << ans[i];
		}
		cout << endl;
	}
	return 0;
}

标签:更赛,草地,GHHGG,USACO,测试用例,喂饱,奶牛
From: https://blog.csdn.net/2401_86356836/article/details/142186318

相关文章

  • USACO记录
    2019Dec9.4感觉没啥难度,C的思维很好,值得学习。A简单区间dp。\(f_{l,r}\)表示只在\([l,r]\)内部覆盖得到的最大权值,转移首先将两个相邻区间\([l,k],[k+1,r]\)拼起来,以及找到覆盖点区间\([l,k-1],[k+1,r],cov(k,l,r)\),其中\(cov\)可以\(n^3\)预处理。B考虑对于每......
  • 题解:[USACO07DEC] Sightseeing Cows G
    洛谷P2868题目大意有个nnn个点,mmm条边的有向图,点有点权,边有边......
  • 洛谷题单指南-常见优化技巧-P2880 [USACO07JAN] Balanced Lineup G
    原题链接:https://www.luogu.com.cn/problem/P2880题意解读:在若干个不定长区间里,求区间最大值与最小值之差解题思路:对于区间求最值,通常有几种方式:1、暴力法,通过枚举所有的区间来计算区间最值2、单调队列,针对区间长度固定的情况3、ST表,针对区间长度不固定且元素不会发生改变的......
  • P2926 [USACO08DEC] Patting Heads S
    根据题意我们不难想出枚举1到n,然后逐个判断能整除自己的个数,时间复杂度O(N^2),n<=1e5,明显会爆炸。考虑优化,我们看到a[i]<=1e6,可以开一个桶来记录,然后枚举1到maxn(即最大的a[i]),然后从i开始,每次加i,w[j](记录能整除j的a[i]的个数)+=c[i](值为i的个数)。代码:#include <bits/stdc......
  • [USACO3.2] 香甜的黄油 Sweet Butter(Dijkstra)
     FarmerJohn发现了做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道NNN只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。FarmerJohn很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特......
  • 洛谷P3128 [USACO15DEC] Max Flow P && 树上差分
    传送门:P3128[USACO15DEC]MaxFlowP首先要学会差分qwq题目意思:给定一个节点数为\(n\)的树,有\(m\)次操作。每次操作给你两个数\(s\)和\(t\),你需要在\(s\)到\(t\)的路径所经过点的运输压力\(+1\)。求最后运输压力最大的点的压力。思路:发现\(s\)到\(t\)的路......
  • [USACO13OPEN] Photo G 题解
    前言题目链接:洛谷。题意简述一个长度为\(n\)的序列,有一些位置染了色。现给出\(m\)条限制,第\(i\)条限制为\(l_i\simr_i\)中有且仅有一个位置染色。求出满足这\(m\)中条件,染色位置个数最多为多少。\(n\leq2\times10^5\),\(m\leq10^5\)。题目分析方法\(1\):差......
  • 洛谷题单指南-常见优化技巧-P3143 [USACO16OPEN] Diamond Collector S
    原题链接:https://www.luogu.com.cn/problem/P3143题意解读:找到两个不相交的最长连续序列,使得序列最大值和最小值差不超过k,求两个最长的序列长度和。解题思路:先将所有数从小到大排序,记为a[]要找到两个不相交的最长连续序列,可以采用下面技巧:设b[i]表示i之前“差值在k之内的连续......
  • [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two--记忆化题解
    题目复述:链接跳转:[USACO2.4]两只塔姆沃斯牛TheTamworthTwo-洛谷#[USACO2.4]两只塔姆沃斯牛TheTamworthTwo##题目描述两只牛逃跑到了森林里。FarmerJohn开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。追击在$10\times10$的平面网......
  • 题解:洛谷 P10497 [USACO03Open] Lost Cows
    原题链接思路+算法首先,考虑读入到\(a_i\)时,如果要得到此时的最优解(指所有牛的编号不重不漏地覆盖\([1,i]\)的所有编号),对于第\(i\)头奶牛,因为在它前面有\(a_i\)头奶牛的编号小于它,所以第\(i\)头奶牛的编号应当为\(a_i+1\)。如果有一头新的奶牛\(i+1\)加入到这个......