Codeforces1156 A画图 Bset 迭代器 C贪心二分

本文解析了Codeforces平台上的三道编程题,包括A题的图形组合计数问题,B题的字符重新排列策略,以及C题的配对优化算法。通过深入分析题目背后的算法思路,为读者提供了清晰的解题步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 圆
2 三角形 底与高相等
3 正方形
3 1 2 三点重合
https://codeforces.com/contest/1156/problem/A

ll n,k;
ll a[maxn];
ll res=0;
int main()
{
	cin>>n;
	rep(i,1,n)
		cin>>a[i];
	rep(i,1,n-1){
		if(a[i]==1) {
			if(a[i+1]==2)
				res+=3;
			else
				res+=4;
		}
		else if(a[i]==2) {
			if(a[i+1]==1)
				res+=3;
			else
				return cout<<"Infinite"<<endl,0;
		}
		else {
			if(a[i+1]==1)
				res+=4;
			else
				return cout<<"Infinite"<<endl,0;
		}
	}
	rep(i,1,n-2){
		res-=(a[i]==3 && a[i+1]==1 && a[i+2]==2);
	}
	cout<<"Finite"<<endl;
	cout<<res<<endl;
	return 0;
}

https://codeforces.com/contest/1156/problem/B
a c e放1组集合中
b d f放1组集合中
注意多组输入清0
set 插入insert() clear() empty()

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;	//1e9
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second

int t;
string s;
int num[26];
set<char> s1,s2;
int main()
{
	cin>>t;
	while(t--){
		memset(num,0,sizeof num);
		s1.clear();
		s2.clear();
		cin>>s;
		for(auto c:s){
			num[c-'a']++;
			if(c&1)
				s1.insert(c);
			else
				s2.insert(c);
		}
		int f=0;
		if(s1.empty() || s2.empty())
			f=1;
		else if(abs(*s1.rbegin()-*s2.begin())!=1 )	//-1
			f=1;	//先s1={a,c..} 后s2={b,d..}
		else if(abs(*s2.rbegin()-*s1.begin())!=1 )
			f=2;	//先s2 后s1
		else 
		{
			cout<<"No answer"<<endl;
			continue;
		}
		if(f==1){
			for(auto c: s1){
				while(num[c-'a']>0){
					cout<<c;
					num[c-'a']--; 
				}
				
			}
			for(auto c: s2){
				while(num[c-'a']>0){
					cout<<c;
					num[c-'a']--; 
				}
				
			}
		}
		else if(f==2){
			for(auto c: s2){
				while(num[c-'a']>0){
					cout<<c;
					num[c-'a']--; 
				}
				
			}
			for(auto c: s1){
				while(num[c-'a']>0){
					cout<<c;
					num[c-'a']--; 
				}
				
			}
		}
		cout<<endl;
	}
	return 0;
}

C
排序后
二分对数
无论奇偶 最大n/2对
判断对数能否达到要求 可以 更多对
第i个 对应剩余n-mid个的倒数第i个 保证成功几率大

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;	//1e9
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second

ll t,a[maxn],n,z;
string s;
bool check(ll mid){
	for(int i=1;i<=mid;i++){
		if(a[n-mid+i]-a[i]<z)	//剩下的 倒着来 从倒数第一个开始构成 
			return false;
	}
	return true;
}
int main()
{
	cin>>n>>z;
	rep(i,1,n)
		cin>>a[i];
	sort(a+1,a+n+1);
	ll l=1,r=n/2,ans=0;		//对数 
	while(l<=r){
		ll mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;	//对数可以更多 
		}
		else
			r=mid-1;
	}
	cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值