USACO 2024 January Contest, BronzeProblem 1. Majority Opinion

1.题目关键句:如果有一种干草是小组中超过一半的奶牛喜欢的,则此次焦点小组访谈结束后,所有奶牛最终都会喜欢这种干草。

如果这个区间是偶数,那么就有可能不存在超过一半的情况,2==2,所以每次访谈必然在奇数区间当中。

题目中举例:

6
1 1 1 2 2 2

在第三个测试用例中,有可能使所有奶牛喜欢种类 1,可以通过主持三次焦点小组访谈达到这一目的——首先使奶牛 1 到 4 进行一次焦点小组访谈,随后使奶牛 1 到 5 进行一次焦点小组访谈,随后使奶牛 1 到 6 进行一次焦点小组访谈。以类似的逻辑,依次操作奶牛 3 到 6,随后是奶牛 2 到 6,随后是奶牛 1 到 6,我们可以使所有奶牛喜欢种类 2。

我们可以思考,1~4,前三个是1,最后一个是2,如果这个区间缩小一点呢,刚才提到,我们需要的是奇数区间,最小的奇数区间是3,那么2~4中,前两个是1,最后一个是2,是相同的效果,所以每次在只有三个数的区间当中,有两个相同的数字,那么整个数组都可以转换成这个数字。

我们需要找的形式为:ABA or AAB,只要存在这种形式,不管之后的内容是什么,都可以转换成A。

为什么没有BAA呢?,因为BAA本质上是AAB。下一次循环时BAA就变成了AAB的形式了。

只要存在上述情况,那么整个数组都可以转换成那个数,但是它不一定是唯一的,比如:

6
1 1 1 2 2 2

既可以全部转换为1(第2~第4),

转换后为:

1 1 1 1 2 2

也可以全部转换为2(第3~第5)。所以通过一个数组存储可以被转换的值。

由于最后一个区间从倒数第3到倒数第一,只判断AAB和ABA形式,下一次循环就结束了,所以我们特判BAA。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],b[N];
bool flag;
int t;
int main(){
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			b[i]=0;
		} 
		
		for(int i=1;i<=n-2;i++){
			if(a[i]==a[i+1]||a[i]==a[i+2]){
				b[a[i]]++;
			}
		}
		if(a[n]==a[n-1])b[a[n]]++;
		flag=false;
		
		for(int i=1;i<=n;i++){
			if(b[i]){
				if(!flag){
					flag=true;
					cout<< i;
				}
				else cout << ' ' << i;
			} 
		}
		if(!flag) cout<<-1;
		cout<<endl;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值