A
有 n( 2 ≤ n ≤ 40 2≤n≤40 2≤n≤40) 个点,再插入一个点,要求所有点到该点的距离比到其他点都要小,求有没有这样的点。
Solution
显然,只有 n=2 的时候才有这样的点。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 100;
int a[maxn];
void solve()
{
int n; cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(n>2)
{
cout<<"NO"<<endl;
return ;
}
else
{
int dis=abs(a[2]-a[1]);
if(dis>1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return ;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}
B
先求出交集,再判断一下左右边界是否被包围即可。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve()
{
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
if(min(r1,r2)<max(l1,l2))
{
cout<<1<<endl;
return ;
}
else
{
int ans=min(r1,r2)-max(l1,l2);
ans+=(l1!=l2);
ans+=(r1!=r2);
cout<<ans<<endl;
return ;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}
C
简单贪心,两人每次都会选序列中最大的数,先排序,然后依次选,选完后用 k 来缩小差距,扫一遍 Bob 选的数让其加到与当前回合 Alice 选的数一样大即可,直到把 k 用完或扫完序列为止。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int maxn = 2e5+3;
int a[maxn];
bool cmp(int &x,int &b)
{
return x>b;
}
void solve()
{
int n,k; cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n,cmp);
int sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
if(i%2) sum1+=a[i];
else sum2+=a[i];
}
int kk=0;
for(int i=1;i<=n;i++)
{
if(i%2==0)
{
kk+=a[i-1]-a[i];
}
}
int ans=sum1-sum2;
if(ans>=min(k,kk)) cout<<ans-min(k,kk)<<endl;
else cout<<0<<endl;
return ;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}