CF1860B
考虑先用所有的花硬币来买,再用普通硬币替换对应面值的花硬币,如果仍有多余,再用普通1元硬币来替换k元的花硬币即可。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
void solve()
{
ll m,k,a1,ak;
cin>>m>>k>>a1>>ak;
ll ans=0;
// 先计算出所需要的花色硬币数量
ll cnt1=m%k; // 1
ll cntk=m/k; // k
ll cur1=max(ll(0),cnt1-a1); // 替代后所需的1面值的硬币
ll curk=max(ll(0),cntk-ak); // 替代后所需的k面值的硬币
ll drop1=max(ll(0),a1-cnt1); // 替代后剩下的 1 面值硬币
ll dropk=max(ll(0),ak-cntk); // 替代后剩下的 k 面值硬币
ll replace=min(drop1/k,curk); // 用 1 面值的硬币去替代 k 面值的硬币数
ans=cur1+curk-replace;
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;
}
Removals Game
Bob 赢只有两种情况:两个数组相等或一个数组为另一个数组的倒序。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve()
{
int n; cin>>n;
vector<int> a(n);
vector<int> b(n);
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
if(a==b)
{
cout<<"Bob"<<endl;
return ;
}
reverse(b.begin(),b.end());
if(a==b) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}
Black Circles
显然从起点到终点的路径一定是直线,如果走直线会被圆碰到无论走其他那条路径都一定会被碰到,如果圆心先走到终点,说明会被碰到,否则不会。只需要判断每个圆心到终点的距离与起点到终点的距离大小即可,只要每个圆心到终点的距离都大于起点到终点的距离就不会被碰到。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int maxn = 5e5+3;
int x[maxn],y[maxn];
int dis(int xa,int ya,int xc,int yc)
{
return (xa-xc)*(xa-xc)+(ya-yc)*(ya-yc);
}
void solve()
{
int n; cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
int sx,sy,ex,ey;
cin>>sx>>sy>>ex>>ey;
int t=dis(sx,sy,ex,ey);
for(int i=1;i<=n;i++)
{
if(t>=dis(x[i],y[i],ex,ey))
{
cout<<"No"<<endl;
return ;
}
}
cout<<"Yes"<<endl;
return ;
}
signed main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; cin>>T;
while(T--) solve();
return 0;
}