码迷,mamicode.com
首页 > 其他好文 > 详细

AtCoder Beginner Contest 117 解题报告

时间:2019-02-03 22:10:44      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:clu   mes   pac   序列   space   差分   统计   二进制   解题报告   

果然abc都是手速场。

倒序开的qwq。
D题因为忘记1e12二进制几位上界爆了一发。

A - Entrance Examination

就是除一下就行了。。。
看样例猜题意系列。

#include<cstdio>
#include<algorithm>
#include<cstring>
int main(){
    double t,x;
    scanf("%lf%lf",&t,&x);
    printf("%lf",t/x);
    return 0;
}

B - Polygon

他都把定理给你了。。。
你直接按他的意思模拟就好,数组都不用开

#include <bits/stdc++.h>

int main() {
    int n, sum = 0, mx = 0;
    scanf("%d", &n);
    for(int x, i = 1; i <= n; ++i) {
        scanf("%d", &x);
        sum += x;
        mx = std::max(mx, x);
    }
    if(mx < sum - mx) puts("Yes");
    else puts("No");
}

C - Streamline

直接贪心就好了。
我们把序列先排序然后差分一下。
显然中间那些长的间隔我们不要走。
所以把间隔排序。
然后再间隔的右边放一个棋子就好了。
也就是说前m大的间隔我们都不用走。这个想了挺久的。。。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <deque>
#include <map>
#include <set>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline

namespace io {

    #define in(a) a=read()
    #define out(a) write(a)
    #define outn(a) out(a),putchar('\n')

    #define I_int ll
    inline I_int read() {
        I_int x = 0 , f = 1 ; char c = getchar() ;
        while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; }
        while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
        return x * f ;
    }
    char F[ 200 ] ;
    inline void write( I_int x ) {
        if( x == 0 ) { putchar( '0' ) ; return ; }
        I_int tmp = x > 0 ? x : -x ;
        if( x < 0 ) putchar( '-' ) ;
        int cnt = 0 ;
        while( tmp > 0 ) {
            F[ cnt ++ ] = tmp % 10 + '0' ;
            tmp /= 10 ;
        }
        while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
    }
    #undef I_int

}
using namespace io ;

using namespace std ;

#define N 100010

int m = read(), n = read();
int a[N], f[N];

bool cmp(int a, int b) {
    return a > b;
}

int main() {
    for(int i = 1; i <= n; ++i) a[i] = read();
    sort(a + 1, a + n + 1);
    if(m >= n) return puts("0"), 0;
    int cnt = 0;
    for(int i = 2; i <= n; ++i) {
        f[++cnt] = a[i] - a[i - 1];
    }
    sort(f + 1, f + n + 1, cmp);
    ll ans = 0;
    for(int i = m; i <= n; ++i) ans += f[i];
    printf("%lld\n", ans);
} 

D - XXOR

据说样例锅了?
反正我记错位运算+上界算错这题卡了半小时。。。
因为是XOR所以我们按位来考虑,从高位往低位贪心。
XOR是不进位的加法,我们从这个角度来考虑。
统计该位上0个数和1个数。
如果0的个数多显然题面里的那个x这一位就必须有1(在x不超过k的情况下)。
注意开1ll,以及不要记错取出一个数的第k位的位运算是长啥样的。。。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <deque>
#include <map>
#include <set>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline

namespace io {

    #define in(a) a=read()
    #define out(a) write(a)
    #define outn(a) out(a),putchar('\n')

    #define I_int ll
    inline I_int read() {
        I_int x = 0 , f = 1 ; char c = getchar() ;
        while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; }
        while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
        return x * f ;
    }
    char F[ 200 ] ;
    inline void write( I_int x ) {
        if( x == 0 ) { putchar( '0' ) ; return ; }
        I_int tmp = x > 0 ? x : -x ;
        if( x < 0 ) putchar( '-' ) ;
        int cnt = 0 ;
        while( tmp > 0 ) {
            F[ cnt ++ ] = tmp % 10 + '0' ;
            tmp /= 10 ;
        }
        while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
    }
    #undef I_int

}
using namespace io ;

using namespace std ;

#define N 100010

ll n = read(), K = read();
ll a[N], cnt[2];

bool cmp(int a, int b) {
    return a > b;
}

int main() {
    for(int i = 1; i <= n; ++i) a[i] = read();
    ll ans = 0;
    for(ll k = 42; k >= 0; --k) {
        cnt[0] = cnt[1] = 0; 
        for(int i = 1; i <= n; ++i) {
            cnt[(a[i]>>k)&1ll]++;
        }
        if(cnt[0] > cnt[1] && ans + (1ll << k) <= K) ans += (1ll << k);
    }
    ll sum = 0;
    for(int i = 1; i <= n; ++i) {
        sum += ans ^ a[i];
    }
    printf("%lld\n", sum);
    return 0;
}

AtCoder Beginner Contest 117 解题报告

标签:clu   mes   pac   序列   space   差分   统计   二进制   解题报告   

原文地址:https://www.cnblogs.com/henry-1202/p/10351045.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!