USACO 2024 Jan Bronze铜组题解

本期是USACO 2024年1月铜组的题解。(洛谷上有题目,可以提交)

Majority Opinion:

这题关键在于一个长度为3的区间内如果有两只牛有相同的喜好,那么是可以将这个区间全部同化,那么可以一步一步的拓展,最终一定可以覆盖所有。其他情况都是不可能的比如说:abbabba...

放个代码↓

#include <bits/stdc++.h>
using namespace std;
long long a[100005];
set<long long> ans;
int main(){
	int tc;
	cin>>tc;
	while(tc--){
		ans.clear();
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(i>=3){
				if(a[i]==a[i-2] || a[i]==a[i-1])
			  		ans.insert(a[i]);
				else if(a[i-1]==a[i-2])
			  		ans.insert(a[i-1]);
			}
		}
		if(n==2){
			if(a[1]==a[2])
				cout<<a[1]<<endl;
			else
		  		cout<<"-1"<<endl;
		}
		else{
			if(ans.empty())
	  			cout<<"-1";
	  		for(set<long long>::iterator itr=ans.begin();itr!=ans.end();itr++){
	  			cout<<*itr;
                cout<<' ';//注意判断itr是否是ans.end()的前一位(ans.end()是空的)
			}
			cout<<endl;		
		}
	}
	return 0;
}

Cannonball:

其实就是简单地模拟。判环的话,就记录一下每个点的力度和方向,只要再次出现就break。

//可怜的奶牛啊,被当做加农炮使
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005],p[100005],d[100005];
bool vis[100005];
int main(){
	int n,s;
	cin>>n>>s;
	for(int i=1;i<=n;i++)
		cin>>a[i]>>b[i];
	int dir=1,power=1,ans=0;
	while(s>=1 && s<=n){
		if(a[s]){
			if(!vis[s] && power>=b[s]){
				vis[s]=true;
				p[s]=power;
				d[s]=dir;
				ans++;
			}
			else if(p[s]==power && d[s]==dir)
				break;
		}
		else{
			power+=b[s];
			dir*=-1;
		}
		s+=power*dir;
	}
	cout<<ans<<endl;
	return 0;
}

Balancing Bacteria:

非常需要G(技)巧的题目。我看了半天也不会,暴力都打不了,结果一看题解是二阶差分!!!!!!!什么鬼玩意啊啊啊啊啊啊啊啊啊啊

如果在差分两次后的数组的第i位上加1,就相当于在原数组i~n上加上了一个首项为1公差为1的等差数列。所以,a两次差分后所有数的绝对值的和,就是答案。代码实现很简单,我就不放了。

---------------------------------------------------------------------------------------------------------------------------

OK,这就是本期的全部内容。我们下期再见!

友情提示:本期的全部代码都有问题,请不要无脑Ctrl C+Ctrl V

//彩蛋
#include <bits/stdc++.h>
using namespace std;
long long a[200005],opt1[200005],opt2[200005];
int main(){
	long long n;
    cin>>n;
    long long ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        opt1[i]=a[i]-a[i-1];
        opt2[i]=opt1[i]-opt1[i-1];
        ans+=abs(opt2[i]);
    }
    cout<<ans<<endl;
    return 0;
}

### 关于2024年12月USACO比赛题目解答 #### 问题背景与概述 针对2024年12月USACO的比赛,具体题目细节尚未公布。然而,基于以往的经验和模式,可以推测该次竞赛可能涉及的基础算法概念以及解决问题的方法。 #### 使用双数存储信息 当遇到需要多次访问同一元素的情况时,采用两个独立的数分别记录这些元素的信息是一种有效策略[^1]。这种方法特别适用于那些具有重复操作特性的场景,能够简化逻辑并提高效率。 #### 清零机制的应用 对于某些特定条件下使用的临时变量或辅助结构(比如计数器`num`),适时地将其重置为初始状态是非常重要的。这有助于防止前一次计算残留影响后续的结果准确性。 #### 时间复杂度考量 考虑到实际应用场景中的数据规模较小,即使实现较为复杂的$O(n^2)$甚至更高阶的时间复杂度算法也是可行的选择。这是因为小量级的数据集使得高时间复杂度带来的性能损耗变得微不足道。 #### 枚举法解决交互型游戏类问题 面对像“Why Did the Cow Cross the Road II”这样的互动式博弈论问题,可以通过枚举所有可能性来进行模拟推演。例如,在两轮游戏中根据不同角色的行为合来预测最终得分情况,并据此得出最优解路径[^2]。 #### 动态规划求解资源分配优化模型 以“最小化草地数量”的挑战为例,通过设定动态转移方程,逐步构建起从局部到全局的最佳解决方案框架。这里的关键在于合理定义状态表示方法及其之间的转换关系,从而确保找到满足约束条件下的最优点[^3]。 #### 特殊规则下胜负判定逻辑设计 在类似于“贝茜和朋友玩的游戏”这类含有特殊胜利条件的任务里,重点是要理解规则背后的数学原理。利用回文特性作为判断依据之一,配合其他因素综合考虑,进而形成一套完整的决策流程用于确定胜者身份[^4]。 #### 处理大规模输入输出技巧 针对较大规模的数据处理需求,如岛屿面积统计等问题,则需引入诸如离散化技术等高级手段加以应对。通过对原始坐标系内的点位进行适当变换映射成新的有序序列,既减少了内存占用又加快了运算速度[^5]。 ```python def solve_palindrome_game(T, samples): results = [] for sample in samples: stones = list(map(int, str(sample))) while sum(stones) > 0 and is_palindromic(sum(stones)): # Bessie takes palindromic number of stones first taken_by_bessie = find_largest_palindrome_less_than_or_equal_to(sum(stones)) stones -= [taken_by_bessie] if sum(stones) == 0: break # Friend then takes remaining stones which must be non-palindromic now friend_takes_rest() winner = 'B' if sum(stones)==0 else 'E' results.append(winner) return ''.join(results) def is_palindromic(num): num_str = str(abs(num)) reversed_num_str = num_str[::-1] return num_str == reversed_num_str def find_largest_palindrome_less_than_or_equal_to(max_value): for i in range(max_value, 0, -1): if is_palindromic(i): return i def friend_takes_rest(): pass # Example usage with multiple test cases represented by T=3 here. print(solve_palindrome_game(3,[7, 9, 1])) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值