【套题】Codeforces#306(div2)[A-C]

A. Two Substrings

  • 题意:问一个字符串中是否同时存在AB和BA,其中AB和BA不能共用同一个B或A。
  • 题解:扫一遍即可。可以考虑如下策略:先找AB,然后从B后的位置继续找BA;再另按BA-AB的顺序找一遍即可。复杂度O(n)。窝的代码则直接暴力出所有的AB和BA位置,只要出现不重叠的两个就OK~数据不大,随便搞。
  • 参考代码:
#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    while (cin >> str) {
        vector<int> ab;
        vector<int> ba;
        for (int i = 0; i < str.length() - 1; ++i) {
            if (str[i] == ‘A‘ && str[i + 1] == ‘B‘) {
                ab.push_back(i);
            } else if (str[i] == ‘B‘ && str[i + 1] == ‘A‘) {
                ba.push_back(i);
            }
        }
        bool flag = false;
        for (int i = 0; i < ab.size(); ++i) {
            for (int j = 0; j < ba.size(); ++j) {
                if (abs(ab[i] - ba[j]) > 1) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                break;
            }
        }
        cout << (flag ? "YES" : "NO") << endl;
    }
    return 0;
}

B. Preparing Olympiad

  • 题意:n个问题,每个问题有一个难度值,要选出来一些。问满足以下条件的方案数:

    • 至少选2个
    • 难度值的和在区间[l,r]内
    • 最难和最简单的问题间的难度值差要≥x
  • 题解:数据很小(n≤15),因此我们可以O(2n)地枚举子集即可。为了方便讨论,可以先排序一下,这样的话前缀和以及难度差都可以平均O(1)地得到。
  • 参考代码:
#include <bits/stdc++.h>
using namespace std;

const int MAX = 16;
int sum[MAX];
int c[MAX];
int n, l, r, x;

bool check(int state) {
    int sum = 0, mind = 0xfffffff, maxd = -1;
    for (int i = 0; i < n; ++i) {
        if (state & 1) {
            sum += c[i];
            if (c[i] > maxd) {
                maxd = c[i];
            }
            if (c[i] < mind) {
                mind = c[i];
            }
        }
        state >>= 1;
    }
    if (sum < l || sum > r || (maxd - mind) < x) {
        return false;
    }
    return true;
}

int main() {
    while (~scanf(" %d %d %d %d", &n, &l, &r, &x)) {
        for (int i = 0; i < n; ++i) {
            scanf(" %d", c + i);
        }
        sort(c, c + n);
        memset(sum, 0, sizeof(sum));
        sum[0] = c[0];
        for (int i = 1; i < n; ++i) {
            sum[i] = sum[i - 1] + c[i];
        }

        int ans = 0;
        for (int i = 0; i < (1 << n); ++i) {
            if (check(i)) {
                ans++;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

C. Divisibility by Eight

  • 题意:给个不超过100位的数,删掉一些位上的数字,能否得到一个能被8整除的值。
  • 题解:考虑阉割后的结果x满足x%8=0,由于1000%8=0,如果x的位数大于3位:设

    y=x%1000

    z=x1000

    那么x=y+z,由于z%1000=0,必然有z%8=0,于是只需要判断是否y%8=0即可。也就是说,我们只需要判断x的后3位即可,也正因此,我们最多只需要找3位即可。数据不大可以直接枚举出来。对于少于2位的情况,当然也可以直接枚举。窝则枚举了1000以内的8的倍数,再依次暴力判断。

  • 参考代码:
#include <bits/stdc++.h>
using namespace std;

pair<bool, string> judge1(string x) {
    for (int i = x.length() - 1; i >= 0; --i) {
        if (x[i] == ‘0‘) {
            return make_pair(true, "0");
        }
    }
    return make_pair(false, "joke");
}

bool judge2(int x) {
    if (x == 0) {
        return false;
    }
    while (x) {
        if (x % 10 == 0) {
            return false;
        }
        x /= 10;
    }
    return true;
}

string toString(int x) {
    string res = "";
    if (x == 0) {
        res = "0";
    }
    while (x) {
        res = (char)(x % 10 + ‘0‘) + res;
        x /= 10;
    }
    return res;
}

void init(vector<string>& x) {
    for (int i = 1; i < 1000; ++i) {
        if (i % 8 == 0 && judge2(i)) {
            //printf("push %d\n", i);
            x.push_back(toString(i));
        }
    }
}

pair<bool, string> judge3(string x, string sub) {
    //cout << "Judge3(" << x << ", " << sub << ")" << endl;
    int i = 0, j = 0;
    while (i < x.size() && j < sub.size()) {
        if (x[i] == sub[j]) {
            ++i;
            ++j;
        } else {
            ++i;
        }
    }
    if (j == sub.size()) {
        return make_pair(true, sub);
    } else {
        return make_pair(false, "fuck");
    }
}

int main() {
    //cout << toString(344) << endl;
    vector<string> box;
    init(box);
    string num;
    while (cin >> num) {
        pair<bool, string> ans = judge1(num);
        if (ans.first) {
            cout << "YES\n0" << endl;
        } else {
            bool flag = false;
            for (int i = 0; i < box.size(); ++i) {
                ans = judge3(num, box[i]);
                if (ans.first) {
                    cout << "YES\n" << ans.second << endl;
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                cout << "NO" << endl;
            }
        }
    }

    return 0;
}

D和E留着下次补…

时间: 2024-10-29 07:03:11

【套题】Codeforces#306(div2)[A-C]的相关文章

套题 codeforces 360

A题:Opponents 直接模拟 #include <bits/stdc++.h> using namespace std; char ch[200]; int main() { int n,k; while(~scanf("%d%d",&n,&k)) { int p=0,sta=1,first=1,ans; for(int i=0;i<k;i++) { sta=1; scanf("%s",ch); for(int i=0;i&l

Educational Codeforces Round 15 套题

这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <vector> usi

Codeforces 583 DIV2 Robot&#39;s Task 贪心

原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使得总花费最小. 题解: 就傻傻的走就好..从左走到右,再走回来,更新序列和答案就好. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define MA

Codeforces #245(div2)

A:A. Points and Segments (easy) 题目看了n久,开始觉得尼玛这是div2的题目么,题目还标明了easy.. 意思是给你一n个点,m个区间,在n个点上放蓝球或者红球,然后让你找一种选择方案使得m个区间内的蓝球和红球数量之差不超过1. 开始想过用dfs,不过这只是div2的A题而已.. 然后想了下,直接输出010101序列不就可以么. 交了一发,发现要先排个序,再输出就可以了. AC代码: #include<iostream> #include<cstdio&g

codeforces#327 div2

codeforces#327 div2 这场状态不好有点可惜,题目都不难,而且很好.. A题:水题. #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef lo

Codeforces 258 Div2

A题,n*m根木棍,相交放置,轮流取走相交的两根,最后谁不能行动,则输掉. min(n,m)&1 为1则先取者赢. B题,给定一个长度为n,且各不相同的数组,问能否通过交换连续一段L....R使得变成单调递增. 如果一开始就是递增的,那么直接输出L...R就是1 1,交换一个就行了:否则判断中间是否有且一段单调递减,且两端交换后使得数组递增. 代码: 1 //Template updates date: 20140718 2 #include <iostream> 3 #include

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

应试教育:你是在“套题”还是在“解决问题”?

?为什么当初会采用"背题型"的方式? ?"背题型"的局限性在哪? ?建构"知识体系"优势在哪? ?"题海战术"的认知错误 ?学习和考试的本质 声明:此文纯属个人学习方法总结. 1.为什么当初会采用"背题型"的方式? 以前上了高中,由于身边学霸太多,为了急于缩短与他们之间的天壤之别,总想着调整自己的学习方法. 本来自己就没什么学习方法,加上老师布置下做不完的题目,况且时常听到"题海战术"的

Codeforces #180 div2 C Parity Game

// Codeforces #180 div2 C Parity Game // // 这道题的题目意思就不解释了 // // 题目有那么一点难(对于我而言),不多说啦 // // 解题思路: // // 首先如果a串和b串相等,不多说直接YES // 如果b串全是0,直接YES // 注意到a串有一个性质,1的个数不会超过本身的加1. // a有个1的上限设为x,b有个1的个数设为y,则如果x < y // 那么直接NO. // // 现在一般情况下,就是模拟啦,找到a的后缀和b的前缀一样的