AtCoder Beginner Contest 321

A - 321-like Checker (atcoder.jp)

AC代码:

#include
#include
#include
#include
#include
#define endl '\n'
//#define int long long
using namespace std;
void solve() {
    string s;
    cin>>s;
    if(s.size()==1){
        cout<<"Yes"<=s[i-1]){
            cout<<"No"<>t;
    while(t--) {
        solve();
    }
    return 0;
}

B - Cutoff (atcoder.jp)

AC代码:

#include
#include
#include
#include
#include
#define endl '\n'
//#define int long long
using namespace std;
const int N=110;
int a[N];
int n,x;
void solve() {
    cin>>n>>x;
    int sum;
    vectorans;
    for(int i=1;i>a[i];
    for(int k=0;k<=100;k++){
        ans.clear();
        sum=0;
        for(int i=1;i=x){
            cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

C - 321-like Searcher (atcoder.jp)

最大的321-like数也就是9876543210,总共的个数也没多少,我们可以构造出所有的321-like数,放进vector容器里,升序,然后取第k-1个数即可

如何构造呢?

考虑二进制枚举,从10开始一直枚举到1111111111(共10个1,即2^10-1),这样枚举到了所有第0位到第9位二进制数选与不选的情况,对于j,则从大到小枚举,从9到0,如果枚举到的二进制串的第j位为1,那么表示选j

AC代码:

#include
#include
#include
#include
#include
#define endl '\n'
#define int long long
using namespace std;
int k;
void solve() {
    cin>>k;
    vectorans;
    for(int i=2;i<(1<<10);i++){
        int x=0;
        for(int j=9;j>=0;j--){
            if((i>>j)&1) x=x*10+j;
        }
        ans.push_back(x);
    }
    sort(ans.begin(),ans.end());
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

或者用dfs构造

AC代码:

#include
#include
#include
#include
#include
#define endl '\n'
#define int long long
using namespace std;
int k;
vectorans;
void dfs(int num){
    if(num) ans.push_back(num);
    if(num%10==0) return;//当num的个位数为0时,就不再递归下去
    for(int i=0;i>k;
    for(int i=0;i<=9;i++) dfs(i);//递归找以i为最高位的321-like数
    sort(ans.begin(),ans.end());
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

D - Set Menu (atcoder.jp)

先分别对a,b数组升序

遍历数组a的每一个数,利用二分求出b中第一个大于p-a[i]的下标,然后进行计算

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int sum[N];
int n,m,p;
void solve() {
    cin>>n>>m>>p;
    for(int i=0;i>a[i];
    for(int i=0;i>b[i];
    sort(a,a+n);
    sort(b,b+m);
    sum[0]=b[0];
    for(int i=1;i>t;
    while(t--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(Atcoder,Beginner,Contest,c++,算法)