1 条题解

  • 0
    @ 2025-10-8 16:57:36

    这一题看上去显然是贪心,我们设两个指针,a 表示头指针,也就是队列首端, b 表示为指针,也就是队列末端。

    下面是最好容易想到的策略:

    当 s[ a ]>s[ b ] ,我们肯定是会选 s[ b ] ,随之 b−− 。

    当 s[ a ]<s[ b ] ,我们肯定是会选 s[ a ] ,随之 a++ 。

    但是,通过样例我们发现,会出现 s[ a ]==s[ b ] 情况,这种情况该怎么处理呢?

    其实也很简单,我们找距离 s[ a ] 和 s[ b ] 最近的且不等于 s[ a或b ] 的字符,再比较它们大小即可。

    /*
    这一题看上去显然是贪心,我们设两个指针,a 表示头指针,也就是队列首端, b 表示为指针,也就是队列末端。
    
    下面是最好容易想到的策略:
    
    当 s[ a ]>s[ b ] ,我们肯定是会选 s[ b ] ,随之 b−− 。
    
    当 s[ a ]<s[ b ] ,我们肯定是会选 s[ a ] ,随之 a++ 。
    
    但是,通过样例我们发现,会出现 s[ a ]==s[ b ] 情况,这种情况该怎么处理呢?
    
    其实也很简单,我们找距离 s[ a ] 和 s[ b ] 最近的且不等于 s[ a或b ] 的字符,再比较它们大小即可。
    
    */
    #include <bits/stdc++.h>
    using namespace std;
    char s[3010];
    int main ()
    {
    	int n;cin>>n;
    	for (int i=1;i<=n;i++)cin>>s[i];
    	int a=1,b=n;
    	for (int i=1;i<=n;i++) 
        {
            if (s[ a ]==s[ b ])
            {
                int p=a,q=b;
                while (s[p]==s[q]) p++,q--;//策略3。
                if (s[p]<=s[q]) printf ("%c",s[ a]),a++;//这里又可以想到上面最简单的两种策略。
                else            printf ("%c",s[ b ]),b--;
            }
            else
            {
                if (s[ a ] >s[ b ]) printf ("%c",s[ b ]),b--;//策略1。
                else            printf ("%c",s[ a ]),a++;//策略2。
            }
    		
    		if(i%80==0) puts("");//每80个字符就换行。
    	}
    	return 0;
    }
    
    • 1

    【贪心】新序列的最小字典序[USACO07NOV] Best Cow Line S

    信息

    ID
    1504
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    100
    已通过
    40
    上传者