CF 660A&B

CF 660 A&B

博客图片

A. Captain Flint and Crew Recruitment

CF 660A

题目概述

题目中定义了一个nearly prime的东西,是两个素数的乘积,现在给出一个正整数,要求把它分成4个不同的正整数和的形式,其中至少3个数是nearly prime,如果可以分成,输出YES病输出一种可行的结果;如果不可能,输出NO.

思路

先计算出最小的3个nearly prime数,分别是6,10,14然后只要这个输入的数据n大于30就可以分成这样4个正整数和的形式,因为要求这4个数必须都不相同,所以对于6+10+14+6=36,6+10+14+10=40,6+10+14+14=44这3中情况特殊处理,找出一组可行解.

代码实现

/*
 * @Author: Shuo Yang
 * @Date: 2020-07-30 21:48:14
 * @LastEditors: Shuo Yang
 * @LastEditTime: 2020-07-30 23:04:03
 * @FilePath: /Code-practice-master/CF/660/A.cpp
 */ 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
ll buf[N] = {0};

void solve(){
    
}


int main(int argc, const char** argv) {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        if(n > 30 ){
            cout<<"YES"<<endl;
            if(n == 36 || n == 44 || n == 40){
                if(n == 36){
                    cout<<"5 6 10 15
";
                }else if( n == 44){
                    cout<<"6 10 13 15
";
                }else{
                    cout<<"6 10 15 9
";
                }
            }else{
                cout<<"6 10 14 "<<(n-30)<<endl;
            }
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

刚开始时看漏了一个条件,忘记4个数必须不同这个约束,然后WA,然后特判把6+10+14+10算成了50WA了一次,直到第三次才通过Pretests,不知道最后会不会FST.

B. Captain Flint and a Long Voyage

CF 660B

题目概述

给出一个(n)位的正整数(x),把它按8421BCD码的形式展开去掉前导0,得到一个数(k),然后把这个数(k)的后面(n)位删掉,得到一个数(r).现在给出位数(n),计算这个最小的正整数(x),使得展开的数(k)删掉最后面的(n)位后得到的数(r)最大.

解题思路

因为展开的位的表现形式是没有前导0的,所以最后删除的部分应该尽可能的长,是1xxx的形式,因为原来的每一位都是十进制数,所以要删除的尾部应该是1000这样的,而前面的部分应该尽可能的大,也就是前面都应该是111这种位形式,所以最后满足的结果应该是(999cdots888)这样的,其中8的个数通过(lceil n/4 ceil)计算得到,9的个数通过(n-lceil n/4 ceil)得到,然后把两部分拼接,就是最终的结果.

代码实现

/*
 * @Author: Shuo Yang
 * @Date: 2020-07-30 21:46:06
 * @LastEditors: Shuo Yang
 * @LastEditTime: 2020-07-30 23:42:26
 * @FilePath: /Code-practice-master/CF/660/B.cpp
 */ 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
ll buf[N] = {0};

void solve(){
    
}

int main(int argc, const char** argv) {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int x = (n+3)/4;
        string ans = string(n-x,'9')+string(x,'8');
        cout<<ans<<endl;
    }
    return 0;
}

其它

原文地址:https://www.cnblogs.com/2018slgys/p/13407428.html