Codeforces Round #486 (Div. 3)

D. Points and Powers of Two

#include<bits/stdc++.h>
using namespace std;

const int maxn=200005;

int n;
int a[maxn];

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);

    vector<int> res = { a[1] };
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < 31; j++){
            int lx = a[i] - (1 << j);
            int rx = a[i] + (1 << j);
            bool isl = binary_search(a + 1, a + n + 1, lx);
            bool isr = binary_search(a + 1, a + n + 1, rx);
            if(isl && isr && int(res.size()) < 3){
                res = { lx, a[i], rx };
            }
            if(isl && int(res.size()) < 2){
                res = { lx, a[i] };
            }
            if(isr && int(res.size()) < 2){
                res = { a[i], rx };
            }
        }
    }

    cout << int(res.size()) << endl;
    for(auto it : res) cout << it << " ";
    cout << endl;

    return 0;
}

 E. Divisibility by 25

题解:能整除25,说明最后两位是00,50,25,75中的一种。

注意前导0的情况,比如50267,所以要先把移动过程中出现的前导0处理掉。还有一种情况502,就是当末位为5,移掉5之后,会出现前导0,并且前导是无法处理掉的,这时可以特判一下。

#include<bits/stdc++.h>
#define ll long long
#define mem(arry, in) memset(arry, in, sizeof(arry))
#define For(index, st, end) for(int index = st; index < end; index++)
using namespace std;

const int maxn = 200005;
const int INF = 1e9 + 7;

ll n, cnt;
int c[20];

void build(ll x){
    cnt = 0;
    while(x){
        c[cnt++] = x % 10;
        x /= 10;
    }
}

int solve_1(){
    int l = -1, r = -1;
    for(int i = 0; i < cnt; i++) if(c[i] == 0) { l = i; break; }
    for(int i = 0; i < cnt; i++) if(i != l && (c[i] == 0 || c[i] == 5)) { r = i; break; }

    if(l == -1 || r == -1) return INF;
    return (l > r ? l + r : l + r - 1);
}

int getzero(int index){
    int t = 0;
    for(int i = index - 1; i >= 0; i--){
        if(c[i] == 0) t++;
        else break;
    }
    return t;
}
int solve_2(){
    int l = -1, r = -1;
    for(int i = 0; i < cnt; i++) if(c[i] == 5) { l = i; break; }
    if(l == cnt - 1 && c[l - 1] == 0){
        int x = getzero(l);
        if(x == cnt - 2) return INF;
        l += x;
    }
    for(int i = 0; i < cnt; i++) if(i != l && (c[i] == 2 || c[i] == 7)) { r = i; break; }
    if(l == -1 || r == -1 || (r == cnt - 1 && c[r - 1] == 0)) return INF;
    return (l > r ? l + r : l + r - 1);
}

int main() { cin >> n; build(n); if(c[0] == 0 && c[1] == 0) { cout << 0 << endl; return 0; } int res = min(solve_1(), solve_2()); cout << (res == INF ? -1 : res) << endl; return 0; }

 

posted @ 2018-06-07 16:03  天之道,利而不害  阅读(160)  评论(0编辑  收藏  举报