A. Painting the Ribbon
如果要将所有颜色变成一样的,那么最优肯定是数量最多的颜色不变,其它都变得和它一样
那么就尽量使得数量最多的颜色数量最少,肯定是平均分
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int n,m,k;
void solve(){
cin>>n>>m>>k;
int ave=n/m;
if(n%m) ave++;
if(n-ave>k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}
B. Make It Ugly
如果所有数都相等,那么无解
当和第一个数不相等时,它的后一个数必须和第一个数相等,否则无需操作,本身就不是beauty
否则就删去连续的和第一个数相等的一段就行
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=3e5+10;
int a[N];
int n;
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
a[n+1]=-1;
bool ok=true;
for(int i=2;i<=n;i++){
if(a[i]!=a[i-1]){
ok=false;
break;
}
}
if(ok){
cout<<-1<<endl;
return;
}
for(int i=2;i<=n;i++){
if(a[i]!=a[1]){
if(a[i+1]!=a[1]){
cout<<0<<endl;
return;
}
}
}
int x,y;
for(int i=1;i<=n;i++){
if(a[i]!=a[1]){
x=i;
break;
}
}
for(int i=n;i>=1;i--){
if(a[i]!=a[1]){
y=i;
break;
}
}
int ans=min(x-1,n-y);
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i]==a[1]) cnt++;
else{
ans=min(ans,cnt);
cnt=0;
}
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}
C. Long Multiplication
原本根据样例大概就能猜出做法,就是让x的某一个高位大,然后后面均让x的位不大于y的位
无奈,比赛时的那种写法如果不加特判就不会判两个数相等的情况,于是就wa在了这种情况
证明:x+y=定值,要使得x * y大,那么x和y尽可能接近
trick:
为避免出现不加特判导致的问题,在每次写完代码后检查是否需要加特判
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
string x,y;
void solve(){
cin>>x>>y;
if(x==y){
cout<<x<<endl;
cout<<y<<endl;
return;
}
int n=x.size();
for(int i=0;i<n;i++){
if(x[i]!=y[i]){
if(x[i]<y[i]) swap(x[i],y[i]);
for(int j=i+1;j<n;j++){
if(x[j]>y[j]) swap(x[j],y[j]);
}
cout<<x<<endl;
cout<<y<<endl;
return;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}