Educational Codeforces Round 155 (Rated for Div. 2)

发布时间 2023-09-25 11:44:00作者: du463

比赛链接

A. Rigged!

题目链接
就是一个比较简单的模拟就可以解决,如何判断能不能第一只需要考虑比他力量大的耐力是不是也比他大就行,而只要比他大,他就不可能第一,否则输出他的力量作为标杆就行,这样也可以避免比他力量小的也可以举起来。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110;
struct node
{
	int s,e;

}a[N];
bool cmp(node a,node b){
	if(a.s==b.s){
		return a.e>b.e;
	}
	return a.s>b.s;
}
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].s>>a[i].e;
	}
	int s1=a[1].s;
	int e1=a[1].e;
	sort(a+2,a+n+1,cmp);
	for(int i=2;i<=n;i++){
		if(a[i].s>=s1){
			if(a[i].e>=e1){
				cout<<-1<<endl;
				return ;
			}
		}
		else{
			break;
		}
	}
	cout<<s1<<endl;
	return ;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

B. Chips on the Board

题目链接
有点像最优策略问题,因为我们要保证n * n的图全部覆盖,我们优先考虑的一定是数值最少的那一行或者那一列,因此我们可以都判断一下,最后直接输出他俩的最小值就是最优情况。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
void solve(){
	int n;
	cin>>n;
	ll minn1=1e9;
	ll minn2=1e9;
	ll s1=0;
	ll s2=0;
	for(int i=1;i<=n;i++){
		ll x;
		cin>>x;
		minn1=min(minn1,x);
		s1+=x;

	}
	for(int i=1;i<=n;i++){
		ll x;
		cin>>x;
		minn2=min(minn2,x);
		s2+=x;
	}
	cout<<min(1ll*minn1*n+s2,1ll*minn2*n+s1)<<endl;
	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

C. Make it Alternating

题目链接
找到一段连续相同的字符串,假设长度为x,我们就需要删除x-1个字符,但是我们有x种,也就是说保留的位置不同就是一段不同的序列。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
const int mod=998244353;

void solve(){
	string s;
	cin>>s;
	ll cnt=0;
	ll ans=1;
	for(int i=0;i<s.size();){
		int j=i+1;
		while(j<s.size()&&s[j]==s[i]){
			j++;
		}
		ll len=j-i;
		cnt+=len-1;
		ans=1ll*ans*len%mod;
		i=j;
	}
	for(int i=1;i<=cnt;i++){
		ans=1ll*ans*i%mod;

	}
	cout<<cnt<<" "<<ans<<endl;
	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}