Educational Codeforces Round 164 (Rated for Div. 2)——B&C
https://codeforces.com/contest/1954
B. Make It Ugly
time limit per test 2 seconds
memory limit per test 256 megabytes
题意:对于一个数组,如果能进行若干以下操作,使得所有元素均相等,则是“美丽”的。
对于 a[i-1] = a[i+1] 的情况,令 a[i] = a[i-1] 。
给定一个“美丽”的数组,问:至少删除多少元素,数组才不是“美丽”的?
由于原来的数组是美丽的,首先,如果此数组所有的元素均相等,显然美丽,我们无法令其变成不美丽数组。
否则,若想使数组不美丽,那么有下列几种方法:
-
在数组中,令等于开头和结尾的元素为“1”,其余都为“0”,如果存在两个以上的“0”在一起,则这些数无法被更改,数组就会丑陋。
-
a[1]!=a[n];因为我们无法改变数组中首位和末尾元素(题目已知的更改条件)
-
所以我们可以删除持续删除队尾(队首)元素,直到队尾和对首元素不相同。或者,可以删除中间元素,另两个以上的“0”相连在一起。
取上述情况的最小值就是答案。
#include<bits/stdc++.h>
//#include<iostream>
//#include<vector>
//#include<algorithm>
//#include<set>
//#include<stack>
//#include<string>
//#include<queue>
//#include<cctype>
//#include<map>
//#include<unordered_map>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
signed main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
vector<int>a(n+1);
int k=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=a[i-1]&&i>1)
{
k=0;
}
}
if(k==1)
{
cout<<"-1"<<endl;
continue;
}
int last=0;
int ans=inf;
for(int i=2;i<=n+1;i++)
{
if(i==n+1||a[i]!=a[1])
{
ans=min(ans,i-last-1);
last=i;
}
}
cout<<ans<<endl;
}
return 0;
}
另一个思路
//找所有和第一个不相同的数的位置,找到这些数两两之间间隔的最小值,并和开头和结尾的两个距离进行比较再取最小值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
priority_queue<int,vector<int>,greater<int>>qmi;//大根堆
priority_queue<int>qma;//小根堆
const int mod = 1e09+7;
int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
void solve(){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; i ++) cin >> a[i];
bool same = 1;
for(int i = 1; i < n; i ++)
if(a[i] != a[0])
same = 0;
if(same)
{
cout << -1 << endl;
return;
}
int cnt = 0;
int ans = 1e9;
for(int i = 0; i < n; i ++)
{
if(a[i] == a[0]) cnt ++;
else ans = min(ans, cnt), cnt = 0;
}
if(cnt) ans = min(ans, cnt);
cout << ans << endl;
}
signed main() {
int t;
cin>>t;
//t=1;
while(t--) {
solve();
}
return 0;
}
//垃圾见谅代码。
//自己的怎么能叫垃圾呢?
#include<bits/stdc++.h>
//#include<iostream>
//#include<vector>
//#include<algorithm>
//#include<set>
//#include<stack>
//#include<string>
//#include<queue>
//#include<cctype>
//#include<map>
//#include<unordered_map>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
signed main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
vector<int>a(n);
int k=1;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]!=a[i-1]&&i)
{
k=0;
}
}
if(k==1)
{
cout<<"-1"<<endl;
}else
{
vector<int>b(n);
if(a[0]!=a[n-1])
{
cout<<"0"<<endl;
}else
{
for(int i=0;i<n;i++)
{
if(a[i]==a[0])
{
b[i]=1;
}else
{
b[i]=0;
}
}
int k1=0;
int max1=0;
int min1=99999999999;
int k2=0;
for(int i=0;i<n;i++)
{
if(b[i]==0)
{
k1++;
}else
{
max1=max(k1,max1);
k1=0;
}
if(b[i]==1)
{
k2++;
}else
{
min1=min(k2,min1);
k2=0;
}
}
k1=0;
int min3=0;
if(max1>=2)
{
cout<<"0"<<endl;
}else
{
for(int i=0;i<n;i++)
{
if(b[i]==1)
{
k1++;
}else{
min3=min(k1,min1);
break;
}
}
k1=0;
for(int i=n-1;i>=0;i--)
{
if(b[i]!=0)
{
k1++;
}else
{
min3=min(min1,k1);
break;
}
}
cout<<min3<<endl;
}
}
}
}
return 0;
}
C. Long Multiplication
time limit per test 2 seconds
memory limit per test 256 megabytes
给你两个长度相同的整数 x 和 y ,它们由从 1 到 9 的数字组成。
您可以执行以下操作任意多次(可能为零):交换 x 中的 i 个位数和 y 中的 i 个位数。
例如,如果 x=73 和 y=31 中的 2 个位数对调,就可以得到 x=71 和 y=33。
你的任务是使用上述操作的任意次数,最大化 x 和 y 的乘积。如果有多个答案,请打印任意一个。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
priority_queue<int,vector<int>,greater<int>>qmi;//大根堆
priority_queue<int>qma;//小根堆
const int mod = 1e09+7;
int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
bool cmp(char a,char b)
{
return a>b;
}
void solve(){
vector<char>a;
string x;
string y;
cin>>x>>y;
int k1=x.size();int k2=y.size();
for(int i=0;i<max(x.size(),y.size());i++)
{
if(i<x.size()&&i<y.size())
{
a.push_back(max(x[i],y[i]));
a.push_back(min(x[i],y[i]));
}if(i>=y.size())
{
a.push_back(x[i]);
}if(i>=x.size())
{
a.push_back(y[i]);
}
}
int k=1;
x="";y="";
for(int i=0;i<a.size();i+=2)
{
if(k==1)
{
if(x.size()<k1&&y.size()<k2)
{
if(a[i]!=a[i+1])
{
k=0;
x+=a[i];
y+=a[i+1];
}else
{
x+=a[i];
y+=a[i+1];
}
}else if(x.size()==k1)
{
y+=a[i];
y+=a[i+1];
}else if(y.size()==k2)
{
x+=a[i];
x+=a[i+1];
}
}else
{
if(x.size()<k1&&y.size()<k2)
{
y+=a[i];
x+=a[i+1];
}
else if(x.size()==k1)
{
y+=a[i];
y+=a[i+1];
}else if(y.size()==k2)
{
x+=a[i];
x+=a[i+1];
}
}
}
cout<<x<<" "<<y<<endl;
}
signed main() {
int t;
cin>>t;
//t=1;
while(t--) {
solve();
}
return 0;
}
(唯一理解)思路来源:https://blog.csdn.net/m0_74087709/article/details/137741104
包扩正式的题解也是这个意思,其证明:
因为两个数的所有数位顺序不可更改,所以要找到找到x,y两个数字第一个不同的位置(记为x),使这个位置的大值归x,小值归y。这样就保证了两个数不相等且x一定比y要大。又要使两个数的差值最小,所以x之后的所有数位都要保证大值归y。由此产生了下面的代码(自己打的,过了。。。)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f
#define pii pair<int,int>
priority_queue<int,vector<int>,greater<int>>qmi;//大根堆
priority_queue<int>qma;//小根堆
const int mod = 1e09+7;
int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
bool cmp(char a,char b)
{
return a>b;
}
void solve(){
vector<char>a;
string x;
string y;
cin>>x>>y;
int k1=x.size();int k2=y.size();
for(int i=0;i<max(x.size(),y.size());i++)
{
if(i<x.size()&&i<y.size())
{
a.push_back(max(x[i],y[i]));
a.push_back(min(x[i],y[i]));
}if(i>=y.size())
{
a.push_back(x[i]);
}if(i>=x.size())
{
a.push_back(y[i]);
}
}
int k=1;
x="";y="";
for(int i=0;i<a.size();i+=2)
{
if(k==1)
{
if(x.size()<k1&&y.size()<k2)
{
if(a[i]!=a[i+1])
{
k=0;
x+=a[i];
y+=a[i+1];
}else
{
x+=a[i];
y+=a[i+1];
}
}else if(x.size()==k1)
{
y+=a[i];
y+=a[i+1];
}else if(y.size()==k2)
{
x+=a[i];
x+=a[i+1];
}
}else
{
if(x.size()<k1&&y.size()<k2)
{
y+=a[i];
x+=a[i+1];
}
else if(x.size()==k1)
{
y+=a[i];
y+=a[i+1];
}else if(y.size()==k2)
{
x+=a[i];
x+=a[i+1];
}
}
}
cout<<x<<" "<<y<<endl;
}
signed main() {
int t;
cin>>t;
//t=1;
while(t--) {
solve();
}
return 0;
}