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;
}