浏览器标题切换
浏览器标题切换end
把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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('\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;
}
posted @ 2019-02-03 21:49  henry_y  阅读(650)  评论(5编辑  收藏  举报