Codeforces Round #661 A~D

题目链接

A、Remove Smallest

水题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
int a[N];
int main()
{
    
    
    int t,n;
    cin >> t;
    while (t--)
    {
    
    
        cin >> n;
        for(int i=0; i<n; i++)
            cin >> a[i];
        sort(a,a+n);
        int sum=0;
        for(int i=1; i<n; i++)
        {
    
    
            if(a[i]>a[i-1]+1)
            {
    
    
                sum = 1;
                break;
            }
        }
        if(sum)
            cout << "NO" <<endl;
        else
            cout << "YES" <<endl;
    }
    return 0;
}

B、Gifts Fixing

水题+1
注意一下最大的范围

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll a[N],b[N];
int main()
{
    
    
    int t,n;
    cin >> t;
    while (t--)
    {
    
    
        cin >> n;
        ll mina = 1e9+10,minb = 1e9+10;
        for(int i=0; i<n; i++){
    
    
            cin >> a[i];
            mina = min(a[i],mina);
        }
 
        for(int i=0; i<n; i++){
    
    
            cin >> b[i];
            minb = min(minb,b[i]);
        }
        ll sum = 0;
        for(int i=0;i<n;i++)
        {
    
    
            sum += max(a[i]-mina,b[i]-minb);
        }
        cout << sum <<endl;
    }
    return 0;
}

C、Boats Competition

题意:给定n个人的重量,分配这些人两两一组,要求每艘船上的两个人的体重和都相等。问最多可以分配出几艘船。
思路:找了很多题解,全都是用暴力去解决……
因为体重的范围很小,枚举每组的体重和,看有几组能够组成。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll a[N],b[N];
ll num[N];
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        ll n,x;
        cin >> n;
        memset(num,0,sizeof(num));
        for(ll i=0;i<n;i++)
        {
    
    
            cin >> x;
            num[x]++;
        }
        ll ans=0;
        for(ll K=2;K<=100;K++)
        {
    
    
            ll temp=0;
            for(ll i=1;i*2<=K;i++)
            {
    
    
                if(i*2!=K) temp+=min(num[i],num[K-i]);
                else temp+=num[i]/2;
            }
            ans=max(ans,temp);
        }
        cout<<ans<<endl;
    }
}

D、Binary String To Subsequences

题意:给你一个长度为d的01串,把他分成若干个子序列,使得每个子序列都满足0和1交替出现,问最少能分成多少个子序列,以及每个元素分别分给哪一个子序列。
思路:其实一直没看懂题意,找题解看明白了。
遍历,如果元素是1,看前面是否有0没有匹配,没有匹配则和原先那个0匹配,否则自己新成一个序列;0同理。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll ans[N],b[N];
ll num[N];
int main(){
    
    
    int t,n;
    string s;
    cin >> t;
    while(t--){
    
    
        cin >> n >> s;
        vector<int>v[2];
        int cnt=0;
        for(int i=0;i<n;i++){
    
    
            int x = s[i]-'0';
            if(v[!x].empty()){
    
    
                v[x].push_back(++cnt);
                ans[i]=cnt;
            }else{
    
    
                v[x].push_back(v[!x].back());
                ans[i]=v[!x].back();
                v[!x].pop_back();
            }
        }
        cout << cnt <<endl;;
        for(int i=0;i<n;i++){
    
    
            cout << ans[i] << ' ';
        }
        cout <<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45949914/article/details/107844253