8.22 Codeforces Round 806 (Div. 4)

YES or YES?

很简单的判断 
优先级:&& > || 判断时一定要记得带上括号!
//代码
void solve() {
    string s;
    cin >> s;
    if ((s[0] == 'y' || s[0] == 'Y') && (s[1] == 'e' || s[1] == 'E') && 
        (s[2] == 's' || s[2] == 'S')) cout << "YES" << endl;
    else cout << "NO" << endl;
}

ICPC Balloons

set去重 没出现过的直接+2 出现过的直接+1 题目意思没有理解清楚直接去看样例!
//代码
void solve() {
    cin >> n;
    char x;
    int ans = 0;
    set<char> st;
    for (int i = 1; i <= n; i++) {
        cin >> x;
        if (!st.count(x)) {
            ans += 2;
            st.insert(x);
        }
        else ans += 1;
    }
    cout << ans << endl;
}

Cypher

很简单直接相反方向写上!
//代码
void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        char c;
        for (int j = 1; j <= x; j++) {
            cin >> c;
            if (c == 'U') a[i] = (a[i] + 9) % 10;
            else a[i] = (a[i] + 1) % 10;
        }
    }
    for (int i = 1; i <= n; i++) cout << a[i] << " ";
    cout << endl;
}

Double Strings

1.截断字符串 看map里面是否有! so easy!
2.因为要判断每一个字符串的情况 所以要把所有的字符串先全部存起来 string s[N];
3.不会截断完所有字符!
4.substr(开始坐标,截几个)
//代码
void solve() {
    cin >> n;
    map<string, bool> mp;
    for (int i = 1; i <= n; i++) {
        cin >> s[i];
        mp[s[i]] = 1;
    }
    for (int i = 1; i <= n; i++) {
        bool flag = false;
        for (int j = 1; j < s[i].size(); j++) {
            string be = s[i].substr(0, j);
            string ed = s[i].substr(j, s[i].size() - j);
            if (mp.count(be) && mp.count(ed)) {
                flag = true;
                break;
            }
        }
        if (flag) cout << 1;
        else cout << 0;
    }
    cout << endl;
}

Mirror Grid

1. 判断中心对称的四个位置中,min(1的个数,0的个数) res+=min
2. 每次旋转交换的点都是四个一组没有变过 所以只用讲四个点赋值为同一个值就可以
3. 遇到这种题目别慌 先冷静分析一下
//代码
void solve() {
    cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) cin >> a[i] + 1;//表示从1开始输入
    for(int i=1;i<=n;i++)
        for (int j = 1; j <= n; j++) {
            if (a[i][j] != '2') {
                int cnt = 0;
                cnt = a[i][j] + a[n - i + 1][n - j + 1] + a[n - j + 1][i] + a[j][n - i + 1] - 4 * '0';
                ans += min(cnt, 4 - cnt);
                a[i][j] = a[n - i + 1][n - j + 1] = a[n - j + 1][i] = a[j][n - i + 1] = '2';
            }
        }
    cout << ans << endl;
}

Yet Another Problem About Pairs Satisfying an Inequality

1.直接求前缀和,不满足的剔除
2.满足的直接加上s[a[i]-1],保证大于就行!
//代码
void solve() {
    cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (i > a[i]) s[i] = s[i - 1] + 1;
        else s[i] = s[i - 1];
    }
    for (int i = 1; i <= n; i++) {
        if (i > a[i]) ans += s[a[i] - 1];
    }
    cout << ans << endl;
}

Good Key, Bad Key

1.永远不会在好钥匙之前遇到坏钥匙,所以优先使用好钥匙再使用坏钥匙,使用坏钥匙的个数不会超过log2(10^9)=30个箱子,之后的所有箱子都是0 2的多少次方 直接取对数
2.将两步综合到一步 每往后移一步就把上一步跳过的好钥匙情况加上!先判断坏钥匙,此情况是已经加上了前面都是好钥匙的情况了!
//代码
void solve() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> a[i];
    int ans = 0, sum = 0;//记录!
    for (int i = -1; i < n; i++) {
        int tmp = sum;
        for (int j = i + 1; j < min(n, i + 32); j++) {
            int copy = a[j];
            copy >>= j - i;
            tmp += copy;
        }
        ans = max(ans, tmp);
        if (i + 1 != n) sum += a[i + 1] - k;
    }
    cout << ans << endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值