2019 ACM训练计划——( 每天5题 ) 训练计划17【哥德巴赫猜想】【8的倍数】【sscanf】

A

Codeforces Round #303 (Div. 2), problem: (D) Queue


题目大意

排队问题,等候久了会让人失望,一个人失望会因为前面的人处理时间超过了自己等待时间


题解

对时间进行从小到大排序,可以累加队列前面的人的等待时间,然后判断当前的人的等待时间是否大于或者等于这个值 如果是的话,就代表不会失望 加上这个人 否则就会失望

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn],n;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);
    ll cnt=0,ans=0;
    for(int i=0;i<n;i++){
        if(a[i]>=ans){
            cnt++;
            ans+=a[i];
        }
    }
    cout<<cnt<<endl;
    return 0;
}

B

Codeforces Beta Round #1, problem: (B) Spreadsheet


题目大意

对于列数进行二十六进制和十进制之间的转化


题解

巧妙运用sscanf取字符串中不同数据类型的值

#include<bits/stdc++.h>
using namespace std;
int t;
const int maxn=1e6+10;
char ss[maxn],ss2[maxn],*p;
void f(int c){
    if(!c)
        return;
    f((c-1)/26);
    putchar((c-1)%26+'A');
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%s",ss);
        int a,b;
        if(sscanf(ss,"R%dC%d",&a,&b)==2){
            f(b);
            cout<<a<<endl;
        }
            //cout<<tostr(b)<<a<<endl;
        else{
            sscanf(ss,"%[A-Z]%d",ss2,&a);
            //printf("R%dC%d\n",a,tonum(ss2));
            for(p=ss2,b=0;*p;p++){
                b=b*26+*p-'A'+1;
            }
            printf("R%dC%d\n",a,b);
        }
    }
    return 0;
}

C

Codeforces Round #306 (Div. 2), problem: © Divisibility by Eight


题目大意

给你一个数字,你可以删除其中一些数字,然后问是否可以使得这个数字是8的倍数


题解

这道题给跪了Orz

▄█▀█●

数学大佬就秒懂。。。 数学结论题,只要有尾部有三位数是8的倍数,那么这个数就能被8整除。这结论一般想不到,只有大佬才想得到。又因为是随意输出一个,所以只要枚举一位数,两位数,三位数能被8整除输出答案即可

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=1e2+10;
char s[maxn];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>s+1;
    int n=strlen(s+1);
    int x=0;
    //1位
    for(int i=1;i<=n;i++){
        x=s[i]-'0';
        if(x%8==0){
            cout<<"YES"<<endl;
            cout<<x<<endl;
            return 0;
        }
    }
    //2位
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            x=(s[i]-'0')*10+s[j]-'0';
            if(x%8==0){
                cout<<"YES"<<endl;
                cout<<x<<endl;
                return 0;
            }
        }
    }
    //3位
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int k=j+1;k<=n;k++){
                x=(s[i]-'0')*100+(s[j]-'0')*10+s[k]-'0';
                if(x%8==0){
                    cout<<"YES"<<endl;
                    cout<<x<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<"NO"<<endl;
    return 0;
}

D

Decimal


题目大意

看1/n是否是无限小数 如果是的话输出Yes 否则输出No


题解

判断n是否含有5或者2的因子

#include<bits/stdc++.h>
using namespace std;
int t,n;
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        while(n%2==0)
            n/=2;
        while(n%5==0)
            n/=5;
        if(n!=1)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

E

Codeforces Round #270, problem: (A) Design Tutorial: Learn from Math


题目大意

每个不小于12的整数可以表示为两个合成数的和,如果满足条件有多组,输出其中的一组


题解

把一个数拆分为两个合数,投机的方法就是拆分为4或者9.

(哥德巴赫猜想)

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    if(n%2==0)
        cout<<4<<" "<<n-4<<endl;
    else
        cout<<9<<" "<<n-9<<endl;
    return 0;
}
学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 博客之星 前端开发攻城狮
JS,TS,LeetCode,Vue,React,算法爱好者。
主要分享前端知识,立志成为优秀前端博主。
座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值