2019.7.12

2019.7.12

cf 1159 A

-表示取石头,+表示放石头,问你能放多少个石头?

注意:没有石头也能取石头(神奇),放进去的石头能被取出来。

#include <cstdio>

int main() {
    int n;
    while(~scanf("%d", &n)) {
        int cnt1 = 0;
        char a;
        for(int i = 0; i < n; i++) {
            scanf(" %c", &a);
            if(a == '-') {
                if(cnt1) cnt1--;
            }
            else cnt1++;
        }
        printf("%d
", cnt1);
    }
    return 0;
}

cf 1159 B

求k的最大值,就是求min(a[i], a[j]) / abs(i - j)的最少值

题解:把每一个a[i]当作最小值,然后取离他最远的距离当作abs(i-j);

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a[3000010];
int main() {
    int n;
    while(~scanf("%d", &n)) {
        memset(a, 0, sizeof(a));
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        int k = 0x3f3f3f3f;
        for(int i = 0; i < n; i++) {
            if(k > a[i] / max(i, n - 1 - i)) k = a[i] / max(i, n - 1 - i);
        }
        printf("%d
", k);
    }
    return 0;
}

cf 1159 C

有n个男孩,m个女孩,第i个男孩至少要派给一个女孩ai个糖果,可以给其他女孩至少ai个糖果。第i个女孩至少收到一个男孩给她bi个糖果,但是每一个男孩都不能给第i个女孩超过bi个糖果。求男孩给出的最少的糖果数。

#include <cstdio>
#include <algorithm>

using namespace std;
int main() {
    long long n, m;
    while(~scanf("%lld %lld", &n, &m)) {
        long long a[100010], b, ans = 0, sum = 0, minn = 0x3f3f3f3f;
        for(int i = 0; i < n; i++) {
            scanf("%lld", &a[i]);
        }
        sort(a, a + n);
        for(int i = 0; i < m; i++) {
            scanf("%lld", &b);
            sum += b;
            if(b < minn) minn = b;
        }
        if(a[n-1] > minn) printf("-1
");
        else {
            for(long long i = 0; i < n - 1; i++) {
                ans += a[i] * m;
            }
            ans += sum;
            if(a[n-1] != minn) {
                ans = ans - (minn - a[n-1]);
                ans = ans + (minn - a[n-2]);
            }
            printf("%lld
", ans);
        }
    }
    return 0;
}

cf 1162A

挺容易理解的一道水题

#include <cstdio>

int main() {
    int n, h, t;
    while(~scanf("%d %d %d", &n, &h, &t)) {
        int vis[55], l, r, x, ans = 0;
        for(int i = 1; i <= n; i++) vis[i] = h;
        for(int i = 0; i < t; i++) {
            scanf("%d %d %d", &l, &r, &x);
            for(int j = l; j <= r; j++) {
                if(vis[j] > x) vis[j] = x;
            }
        }
        for(int i = 1; i <= n; i++) {
            ans += vis[i]*vis[i];
        }
        printf("%d
", ans);
    }
    return 0;
}

cf 1162B

题意:给你两个矩阵,要求你只能交换两个矩阵相同位置的数,问能否使得两个矩阵每一行及每一列单调递增。

题解:把小的数放在a矩阵,把大的数放在b矩阵,最后判断一下两个矩阵是否满足条件就可以了。

#include <cstdio>

int main() {
    int n, m;
    while(~scanf("%d %d", &n, &m)) {
        int a[55][55], b[55][55];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                scanf("%d", &a[i][j]);
            }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                scanf("%d", &b[i][j]);
            }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(a[i][j] > b[i][j]) {
                    int t = a[i][j];
                    a[i][j] = b[i][j];
                    b[i][j] = t;
                }
            }
        }
        int flag = 0;
        if(n == 1) {
            for(int j = 0; j < m - 1; j++) {
                if(a[0][j+1] <= a[0][j] || b[0][j+1] <= b[0][j]) {
                    flag = 1;
                    break;
                }
            }
        }
        else if(m == 1) {
            for(int i = 0; i < n - 1; i++) {
                if(a[i+1][0] <= a[i][0] || b[i+1][0] <= b[i][0]) {
                    flag = 1;
                    break;
                }
            }
        }
        else {
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < m - 1; j++) {
                    if(a[i][j+1] <= a[i][j] || b[i][j+1] <= b[i][j]) {
                        flag = 1;
                        break;
                    }
                    if(flag) break;
                }
            }
            for(int j = 0; j < m; j++) {
                for(int i = 0; i < n - 1; i++) {
                    if(a[i+1][j] <= a[i][j] || b[i+1][j] <= b[i][j]) {
                        flag = 1;
                        break;
                    }
                    if(flag) break;
                }
            }
        }
        if(flag) printf("Impossible
");
        else printf("Possible
");
    }
    return 0;
}

cf 1162C

有很多个杯子,把球放在某一个杯子里。另一个人提问:球是否在第x个杯子里?在一局游戏,你只能把球移动的旁边的杯子或者不移动,只能移动一次,移动的时间可以随意,在另一个人问问题前或后都可以,求球不被询问到的方案数。

#include <cstdio>
#include <cstring>


int main() {
    int n, k;
    while(~scanf("%d %d", &n, &k)) {
        int sta[100010], endd[100010], b;
        memset(sta, 0, sizeof(sta));
        memset(endd, 0, sizeof(endd));
        for(int i = 1; i <= k; i++) {
            scanf("%d", &b);
            if(sta[b] == 0) sta[b] = i;
            endd[b] = i;
        }
        int ans = 0;
        if(sta[1]) {
            ans++;
            if(sta[2] && sta[2] <= endd[1]) ans++;
        }
        if(sta[n] && n != 1) {
            ans++;
            if(sta[n-1] && sta[n-1] <= endd[n]) ans++;
        }
        for(int i = 2; i < n; i++) {
            if(sta[i] == 0) continue;
            else {
                ans++;
                if(sta[i-1] && sta[i-1] <= endd[i]) ans++;
                if(sta[i+1] && sta[i+1] <= endd[i]) ans++;
            }
        }
        printf("%d
", (n - 2) * 3 + 4 - ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fanshhh/p/11180644.html