B. Azamon Web Services(贪心)

Codeforces Round #607 (Div. 2)

https://codeforces.com/problemset/problem/1281/B

题意:每个测试用例给定两个字符串chr1,chr2,若按字典序排序前者小于后者则直接输出chr1,否则对chr1字符数组最多交换一对字符,若可以满足chr1<chr2则输出交换后的chr1,若无论怎么交换都不能满足则输出“---”;

题解:采用贪心思想,用下标i从前往后遍历chr1,将当前i所指向的字符设为min,即char min=chr1[i]; 同时再设一个下标sign从后往前遍历,sign--;若chr1[sign]<min,则min=chr1[sign],同时标记sign;当sign<=i时结束sign的此次查找,判断若sign发生改变则break退出i的遍历,否则continue;因为题目要求至多一次交换。break后交换两字符,若strcmp(chr1,chr2)<0则输出chr1,否则输出“---”。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
using namespace std;
char chr1[5005],chr2[5005];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%s %s",chr1,chr2);
		if(strcmp(chr1,chr2)<0) cout<<chr1<<endl;
		else{
			int sign_first=0,sign_last=0;
			int len1=strlen(chr1);
			for(int i=0;i<len1;i++)
			{
				char chr=chr1[i];
				int sign=len1-1;
				sign_last=i;
				while(sign>i)
				{
					if(chr1[sign]<chr){
						chr=chr1[sign];
						sign_last=sign;
					}
					--sign;
				}
				sign_first=i;
				if(sign_last==i) continue;
				else break;
			}
			swap(chr1[sign_last],chr1[sign_first]);
			if(strcmp(chr1,chr2)<0) printf("%s
",chr1);
			else cout<<"---
";
		}
	}
	return 0;
}
天晴了,起飞吧
原文地址:https://www.cnblogs.com/jianqiao123/p/12295779.html