• Codeforces Round #827 (Div. 4)


    A:给定三个数字,问是否存在1个数字是另外两个的和

    1. void solve(){
    2. int a, b, c;
    3. cin >> a >> b >> c;
    4. if(a + b == c || a + c == b || b + c == a) puts("YES");
    5. else puts("NO");
    6. }

    B:给定一个数组,能否存在一个组合是单调上升的 

    思路:显然只要没有相同的两个数即可

    1. void solve(){
    2. int n; cin >> n;
    3. set<int> s;
    4. rep(i, 0, n){
    5. int x; cin >> x;
    6. s.insert(x);
    7. }
    8. cout << (s.size() == n ? "YES" : "NO") << endl;
    9. }

    C:给定一个 8×8 的网格,其中 . 符号表示空,'R' 符号表示红色,'B' 符号表示蓝色。 每次可能水平地画一道红色,或者垂直地画一道蓝色,后面画的会覆盖前面画的,给出最终结果,问最后画的是什么颜色。

    思路:很简单,只要行内有完整的一行,说明这一行是最后画的,如果行内没有那就是列了

    1. void solve(){
    2. string s[8];
    3. int R = false;
    4. for(int i = 0; i < 8; i++) {
    5. cin >> s[i];
    6. if(s[i] == "RRRRRRRR") R = true;
    7. }
    8. if(R) cout << "R\n";
    9. else cout << "B\n";
    10. }

    D:给定一个长度为 n <= 2e5 的数组,数字大小不超过 1000。求最大的 i + j 满足 a[i] 与 a[j] 互质。

    思路:考虑到数字大小不超过1000,且i显然越大越好,所以最后一次出现的位置我们才记录。然后暴力枚举这1000个数即可!

    1. const int N = 1010;
    2. int g[N][N];
    3. //n^2 枚举所有可能不可取,但我们发现数字大小不超过 1000,这也就意味着这个数组会有很多的重复元素,把这些重复的元素只保留下标最大的即可,这样就可以 1000^2 枚举了。
    4. inline void solve(){
    5. int n; cin >> n;
    6. int v[1020] = {0};
    7. repn(i, 1, n){
    8. int x; cin >> x; v[x] = i;
    9. }
    10. int res = -1;
    11. for (int i = 1; i <= 1000; i ++ )
    12. for (int j = 1; j <= 1000; j ++ ){
    13. if(g[i][j] && v[i] && v[j]) res = max(res, v[i] + v[j]);
    14. }
    15. cout << res << endl;
    16. }
    17. int main(){
    18. IOS;
    19. int t; cin >> t;
    20. for(int i = 1; i <= 1000; i++) //打表看互质
    21. for(int j = 1; j <= 1000; j++)
    22. g[i][j] = (__gcd(i, j) == 1);
    23. while(t -- ){
    24. solve();
    25. }
    26. return 0;
    27. }

     

    E:给定一个长度为 n <= 2e5 的数组 a[i],表示每级台阶的高度。

    给定 q<=2e5 个询问,每个询问给出 k 表示一次最多能跨越的高度,问从 0 开始最多能爬多高。

    思路:显然只要小于k的位置我们是肯定都能跨越的,所以我们用一个数组维护当前位置前的最大高度,那么这个数组显然是单调不降的!那么就可以二分出位置了。然后直接计算一下前缀和即可

    1. inline void solve(){
    2. int n, q; cin >> n >> q;
    3. repn(i, 1, n){
    4. cin >> s[i];
    5. mx[i] = max(s[i], 1ll * mx[i - 1]);//维护当前位置前最大的高度
    6. s[i] += s[i - 1];//前缀和
    7. }
    8. while(q -- ){
    9. int k; cin >> k;
    10. auto t = upper_bound(mx + 1, mx + n + 1, k) - mx - 1;
    11. cout << s[t] << ' ';
    12. }
    13. cout << endl;
    14. }

     

     F:给定两个字符串 s, t,初始时全为空。

    有 q<=2e5 次操作,每次操作选择其中一个串,给定 k <= 2e5,str,往后添加 k 个 str。并询问是否存在一种方式重排 s,t 的字符,使得 s 的字典序严格小于 t 的字典序。

     

    思路:显然只要有s中加入了不是'a'的字符,就肯定比t小了,否则就得比较字符串长度大小了

    1. inline void solve(){
    2. int n;
    3. cin >> n;
    4. ll aa = 0, bb = 0, sz1 = 0, sz2 = 0;
    5. while(n -- ) {
    6. int op, k;
    7. string s;
    8. cin >> op >> k >> s;
    9. if(op == 1) sz1 += k * s.size();
    10. else sz2 += k * s.size();
    11. for(int i = 0 ; s[i] ; i ++ )
    12. if(s[i] != 'a') {
    13. if(op == 1) aa = 1;//给s加上了, s输了
    14. else bb = 1;//t输了
    15. }
    16. if(bb) {
    17. puts("YES");
    18. continue;
    19. } else if(aa) {
    20. puts("NO");
    21. continue;
    22. } else {
    23. if(sz1 >= sz2) puts("NO");
    24. else puts("YES");
    25. }
    26. }
    27. }

     

     

     

  • 相关阅读:
    python-web开发环境准备
    Spring之BeanFactory
    迁移学习
    Python实现连连看12
    【数据结构-树】AVL树
    js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。
    kuberadm搭建k8s集群
    EPAI手绘建模APP常用工具栏_1
    JavaScript的BOM操作
    报价33万的极星电动车,一组电池就高达40万?
  • 原文地址:https://blog.csdn.net/m0_61837058/article/details/127446322