zoukankan      html  css  js  c++  java
  • CodeForces

    题目链接:

    http://codeforces.com/problemset/problem/777/B

    题目大意:

    A, B玩游戏,每人一串数字,数字不大于1000,要求每人从第一位开始报出数字,并且比较,如果等于则没事,A>B则B被打一下,反之A被打一下,A很老实不会耍计谋,老老实实从第一个开始报,但是B很狡猾,会改变数字的顺序。问2个次数,一个是B最小被打的次数,二是A最多被打的次数。

    思路:

    贪心,模拟一下就行了。这里用到了cmp的技巧,直接用字符比较,这样就省去了转换为字符串的步骤。

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    const int MX = 1000+10;
    char a[MX], b[MX];
    
    bool cmp(char a, char b)
    {
        return a < b;
    }
    
    int main()
    {
        int n;
        int cnt1 = 0;
        int cnt2 = 0;
        scanf("%d", &n);
        scanf("%s", a); scanf("%s", b);
        sort(a, a+n, cmp); sort(b, b+n, cmp);
        for(int i = 0, j = 0; j < n; ++j) //从头开始遍历比较完,找到B被打的最小次数
        {
            if(a[i] <= b[j]) i++; //这里从a,b最小值开始一直找到a > b,其中一起不断增大这样能找到b最少被打的次数
            else cnt1++;
        }
        for(int i = n-1, j = n-1; i >= 0; --i) //从尾开始遍历,从a, b的最大值开始,其中a不断减小,b遇到合适的再减小,这样能找到A最多被打的次数,
        {
            if(b[j] > a[i])
            {
                cnt2++;
                j--;
            }
        }
        printf("%d
    %d
    ", cnt1, cnt2);
    }
    View Code

    如有疑问,欢迎评论指出!

    化繁为简 大巧不工
  • 相关阅读:
    CF601B Solution
    CF847F Solution
    CF877D Solution
    CF1472F Solution
    CF1472G Solution
    CF1355E Solution
    CF912D Solution
    CF1167F Solution
    shell脚本自动备份MySQL数据库
    centos7 crontab笔记
  • 原文地址:https://www.cnblogs.com/mpeter/p/10372563.html
Copyright © 2011-2022 走看看