2 条题解

  • 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;
    }
    
    • 0
      @ 2025-10-8 16:57:26
      /*
      这一题看上去显然是贪心,我们设两个指针,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
      标签
      递交数
      99
      已通过
      40
      上传者