AtCoder Beginner Contest 117 解题报告

Posted henry-1202

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 117 解题报告相关的知识,希望对你有一定的参考价值。

果然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('
')

    #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
", 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('
')

    #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
", sum);
    return 0;
}

以上是关于AtCoder Beginner Contest 117 解题报告的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242