zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    添加GDataXMLNODE.h和.m的方法
    NSPredicate的用法
    oc正则表达式基本语法(二)
    洛谷3931 [洛谷八连测] 一道难题
    洛谷2024 食物链 并查集
    洛谷1005 【NOIP2007】矩阵取数游戏
    洛谷3927 [洛谷八连测] 一道中档题
    洛谷1113 杂务
    洛谷1019 单词接龙 字符串dfs
    洛谷1414 又是毕业季II
  • 原文地址:https://www.cnblogs.com/fanshhh/p/11180644.html
Copyright © 2011-2022 走看看