zoukankan      html  css  js  c++  java
  • 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;
    }
    天晴了,起飞吧
  • 相关阅读:
    OpenEuler 中C与汇编的混合编程
    实验四 Web服务器2
    实验四 Web服务器1
    OpenEuler中C语言中的函数调用测试
    第14章学习笔记(20191213兰毅达)
    第13章学习笔记(20191213兰毅达)
    第12章学习笔记(20191213兰毅达)
    冲刺day5
    Oracle中Sequence使用
    Oracle中dual表的用途
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/12295779.html
Copyright © 2011-2022 走看看