思维题 2016.10.27

1、Codeforces 573B Bear and Blocks

参考:http://blog.csdn.net/u012015746/article/details/51155554

http://codeforces.com/contest/573/standings

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;

const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 1e5 + 10;

int n;
int h[maxn], Left[maxn], Right[maxn];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &h[i]);
    }
    for (int i = 1; i <= n; ++i) {
        Left[i] = min(h[i], Left[i-1] + 1);
    }
    for (int i = n; i >= 1; --i) {
        Right[i] = min(h[i], Right[i+1] + 1);
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, min(Left[i], Right[i]));
    }
    printf("%d\n", ans);
    return 0;
}


2、Codeforces 367A Sereja and Algorithm

参考:http://codeforces.com/contest/367/standings/page/1

解题思路:

如果满足条件的话, x 和 y,x 和 z,y 和 z 的差都不会超过 1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;

const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 1e5 + 10;

int m, l, r;
char s[maxn];
int sum_x[maxn], sum_y[maxn], sum_z[maxn];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    scanf("%s %d", s, &m);
    int len = strlen(s);
    for (int i = 0; i < len; ++i) {
        sum_x[i + 1] = sum_x[i] + (s[i] == 'x');
        sum_y[i + 1] = sum_y[i] + (s[i] == 'y');
        sum_z[i + 1] = sum_z[i] + (s[i] == 'z');
    }
    while (m--) {
        scanf("%d %d", &l, &r);
        int num_x = sum_x[r] - sum_x[l - 1];
        int num_y = sum_y[r] - sum_y[l - 1];
        int num_z = sum_z[r] - sum_z[l - 1];
        bool flag = true;
        if (abs(num_x - num_y) > 1 || abs(num_x - num_z) > 1 || abs(num_y - num_z) > 1) {
            flag = false;
        }
        if (num_x + num_y + num_z <= 2) {
            flag = true;
        }
        if (flag) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}


3、Codeforces 722C Destroying Array

参考:http://www.cnblogs.com/flipped/p/5928466.html

解题思路:

倒过来依次放上删除的数,然后找最大连续和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>

using namespace std;

#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1

typedef long long ll;
typedef pair<ll, ll> Pair;

const ll maxn = 1e5 + 10;

ll n;
ll a[maxn], pos[maxn], sum[maxn], Left[maxn], Right[maxn];
bool vis[maxn];
vector<ll> ans;

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    scanf("%I64d", &n);
    for (ll i = 1; i <= n; ++i) {
        scanf("%I64d", &a[i]);
        sum[i] = sum[i - 1] + a[i];
    }
    for (ll i = 1; i <= n; ++i) {
        scanf("%I64d", &pos[i]);
    }
    ll Max = 0;
    for (ll i = n; i > 1; --i) {
        Left[pos[i]] = pos[i], Right[pos[i]] = pos[i];
        vis[pos[i]] = true;
        if (vis[pos[i] - 1]) {
            Left[pos[i]] = Left[pos[i] - 1];
        }
        if (vis[pos[i] + 1]) {
            Right[pos[i]] = Right[pos[i] + 1];
        }
        Left[Right[pos[i]]] = Left[pos[i]];
        Right[Left[pos[i]]] = Right[pos[i]];
        Max = max(Max, sum[Right[pos[i]]] - sum[Left[pos[i]] - 1]);
        ans.push_back(Max);
    }
    for (int i = ans.size() - 1; i >= 0; --i) {
        printf("%I64d\n", ans[i]);
    }
    printf("0\n");
    return 0;
}

4、Codeforces 327A Flipping Game

参考:http://codeforces.com/contest/327/standings

可以求前缀和再暴力,也可以直接暴力

但是我们有 O(n) 的解法....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>

using namespace std;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;

const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 100 + 10;

int n, x, mx, y;
int a[maxn];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H
    scanf("%d", &n);
    x = mx = y = 0;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        if (a[i] == 1) {
            ++y;
        }
        if (a[i] == 0) {
            ++x;
            mx = x > mx ? x : mx;
        } else if (x > 0) {
            --x;
        }
    }
    if (mx == 0) {
        --mx;
    }
    printf("%d\n", mx + y);
    return 0;
}

5、Codeforces 427B Prison Transfer

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <bitset>
#include <ctime>
#include <cctype>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 2e5 + 10;

int n, t, c;
int a[maxn];

int main()
{
#ifdef __AiR_H
    freopen("in.txt", "r", stdin);
#endif // __AiR_H_
    scanf("%d %d %d", &n, &t, &c);
    int cnt = 0, ans = 0;
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        if (a[i] <= t) {
            ++cnt;
        } else {
            cnt = 0;
        }
        if (cnt >= c) {
            ++ans;
        }
    }
    printf("%d\n", ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值