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;
}
posted @ 2024-04-24 22:43  miao-jc  阅读(29)  评论(0编辑  收藏  举报