1. 程式人生 > >CodeChef March Lunchtime 2018 div2

CodeChef March Lunchtime 2018 div2

cst style HR getch lin lld click TE ans

地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions

簡單做了一下,前三題比較水,第四題應該算是經典題

AChef and Friends

直接暴力枚舉即可

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1001, INF = 1e9 + 10;
inline int read() {
    char
c = getchar(); int x = 0, f = 1; 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; } int N, ans = 0; char s[MAXN]; main() { #ifdef WIN32 freopen("a.in", "r", stdin);
#endif N = read(); for(int i = 1; i <= N; i++) { scanf("%s", s + 1); int L = strlen(s + 1); for(int j = 1; j <= L - 1; j++) { if((s[j] == c && s[j + 1] == h)|| (s[j] == h && s[j + 1] == e)|| (s[j]
== e && s[j + 1] == f)) {ans++; break;} } } printf("%d", ans); }
A

BMagic Elements

維護一個所有元素的和,直接模擬即可

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long 
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    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;
}
int N, K, ans = 0;
int a[MAXN];
main() {
#ifdef WIN32
    freopen("a.in", "r", stdin);
#endif
    int T = read();
    while(T--) {
        N = read(); K = read();
        int sum = 0, ans = 0;
        for(int i = 1; i <= N; i++) a[i] = read(), sum += a[i];
        for(int i = 1; i <= N; i++) 
            if(a[i] + K > sum - a[i])
                ans++;
        printf("%d\n", ans);
    }
} 
B

CThree Integers

把式子化成$2B = A +C$的形式,不難看出改B一定是最優的。

特判一下奇偶性即可

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long 
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    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;
}
main() {
#ifdef WIN32
    freopen("a.in", "r", stdin);
#endif
    int N = read();
    while(N--) {
        int A = read(), B = read(), C = read();
        int ans = abs(2 * B - A - C);
        if(ans & 1) printf("%lld\n", ans / 2 + 1);
        else printf("%lld\n", ans / 2);
    }
} 
C

DPartitions

個人感覺是一道比較好的題

設所有元素的和為$sum$

不難發現,不論如何分,分成的段數一定是$sum$的因子

而且不論如何分,第一段一定是$1-x$(以$1$為起點)

這樣我們遇到一個因子就枚舉一邊序列暴力分割就可以

這題TM居然卡常

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long 
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    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;
}
int a[MAXN];
char ans[MAXN];
main() {
#ifdef WIN32
    freopen("a.in", "r", stdin);
#endif
    int T = read();
    while(T--) {
        int N = read(), sum = 0;
        for(int i = 1; i <= N; i++) a[i] = read(), sum += a[i];
        for(int i = 1; i <= N; i++) {
            if(sum % i != 0) {ans[i] = 0; continue;}
            int cur = 0, num = 0;
            for(int j = 1; j <= N; j++) {
                cur += a[j];
                if(cur == sum / i) cur = 0;
                else if(cur > sum / i) {ans[i] = 0; break;}
            }
            ans[i] = (cur == 0 ? 1 : 0);
        }
        for(int i = 1; i <= N; i++) 
            putchar(ans[i]);
        puts("");
    }
}  
D

CodeChef March Lunchtime 2018 div2