zoukankan      html  css  js  c++  java
  • 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

    思路大概和其他的题解一样:

    从当前字符串最前面,最后面选一个字典序较小的然后拉到一个新的字符串序列中,如果相同就一直往中间扫描直到发现不同为止(一个字符如果被选中之后那么就不可以再次选择了),所以我们左右各设一个指针扫描就好了,不需要递归。 —— WuPengrui_666

    此题解终结……诶等一下!84分是怎么回事!

    哦,对了,数据被加强了

    毒瘤chen_zhe

    这里的题解都比较古老……都在数据被增强之前写的

    那……我们谈一下正(you)确(hua)解(bao)法(li)

    朴素暴力最坏可以达到(O(n^2)),就是全部都是同一个字符的情况

    对于这种情况,我们只需特判。因为只有一个字符,取出的字串也就只有一种可能,于是我们直接输出这n个字符不就好了呢~

    code :

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
        int cnt = 0, l = 1, r, n, flag = 1;
        scanf("%d", &n);
        char a[500010], c;
        for(int i = 1; i <= n; i++) {
            getchar(); a[i] = getchar();
            if(i == 1) c = a[i];
            else if(a[i] != c) flag = 0;
        }
        if(flag) {
            for(int i = 1; i <= n; i++) {
                putchar(c);
                if(i % 80 == 0) putchar(10);
            }
            return 0;
        }
        r = n;
        while(l < r) {
            cnt++;
            if(a[l] < a[r]) {
                putchar(a[l]);
                l++;
            } else {
                if(a[r] < a[l]) {
                    putchar(a[r]);
                    r--;
                } else {
                    int x = l, y = r;
                    while(x < y && a[x] == a[y]) x++, y--;
                    if(a[x] < a[y]) {
                        putchar(a[l]);
                        l++;
                    } else {
                        putchar(a[r]);
                        r--;
                    }
                }
            }
            if(cnt % 80 == 0) putchar(10);
        }
        putchar(a[l]);
        return 0;
    }
    

    此题解终结(真的)



  • 相关阅读:
    (4)路由器和交换机区别
    (3)arp协议
    (2)OSi模型
    (1)网络基础概念
    探索JVM底层奥秘ClassLoader源码分析
    数据库类型对应Java语言类型表
    JSON空值处理与 StringUtils工具类使用
    props、state、forms
    React官方中文文档【安装】
    搭建React项目环境【1】
  • 原文地址:https://www.cnblogs.com/iycc/p/10329049.html
Copyright © 2011-2022 走看看