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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅梦曾倾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值