2021.10.8 训练

A - Keanu Reeves

题意:

给定一个n长的只含1和0的字符串,将其分割成一个或若干个1和0个数不相等的字符串。
输出字符串的个数以及分割后的字符串。

分析:

思维题。当字符串本身含0和1的个数不相同,输出1和其本身。当其个数相等,依次输出2、字符串的第一个字符,和剩下的字符。

代码:

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<map>
using namespace std;

typedef long long ll;

int n;

char s[105];

int main(){
    cin>>n;
    int one=0;
    int zero=0;

    for(int i=0;i<n;i++){
        cin>>s[i];
        if(s[i]=='1') one++;
        if(s[i]=='0') zero++;
    }
    if(one!=zero){
        cout<<"1"<<endl;
        cout<<s<<endl;
    }
    else{
        cout<<"2"<<endl;
        cout<<s[0]<<" ";
        for(int i=1;i<n;i++){
            cout<<s[i];
        }
        cout<<endl;
    }
    return 0;
}


PS又在奇奇怪怪的地方WA了 string的输出问题。cout不能输出一个string,如果要正常使用cout输出string,则要添加 #include<string>(忘记了T_T)

B - Number Circle

题意:

给定一个n长的序列,它们形成一个圈,每个数都有两个邻居(相邻数,左右两边).
问这些数是否能构成一个序列,使每一个数的值都小于它的两个邻居之和。
能,输出YES和这个序列(可以从任意元素开始);否则输出NO.

分析:

思维题。要使每一个数的值都小于它的两个邻居之和,可以先将该序列排序。如下:
2 5 1 4 3 ==>1 2 3 4 5
排完序后,可看出除了倒数第一个之外,其他数一定均满足条件(每个数肯定<=右相邻数,再加上左相邻数就肯定满足了),然后只有最后一个数不一定会满足,所以需要特别处理一下最后一个数。
为了使最后一个序列中最大的数满足,就让的邻居变成第二大的数和第三大的数,如下:
1 2 3 4 5 ==>1 2 3 5 4
在这个条件下,若不能满足,则不存在这个序列。

代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;

typedef long long ll;


int a[100005];
int n;

int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    swap(a[n-2],a[n-1]);
    if(a[n-1]+a[n-3]>a[n-2]){
        cout<<"YES"<<endl;
        for(int i=0;i<n-1;i++){
            cout<<a[i]<<" ";
        }
        cout<<a[n-1]<<endl;
    }
    else cout<<"NO"<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值