【UVA/Codeforces】1584 Circular Sequence / 792B Counting-out Rhyme(就是一个圈儿...)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/86974681

https://vjudge.net/problem/UVA-1584

1584 Circular Sequence

输入一个字符串,可以以字符串中任意一个字母作为起始,输出字典序最小的那个字符串

两种方法,一种是设两个标记

【样例输入】CGAGTCAGCT

【样例输出】AGCTCGAGTC

一开始 ans = 0,i=1;(C < G)ans不变

当i = 2时,ans = 0,因为A < C,所以 ans = 2;

当i = 6时,这时ans = 2,一直往后比较,因为ans指向的第三个字符是T,i 指向的第三个字符是C,C < T,所以ans = 6;

最后输出。

下面这个程序是通过一个一个比较去找到字典序最小的那一个。即ans = 6以后,for循环仍然继续。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

char s[105];
int len;
int fun(int ans,int i)
{
	for(int j=0;j<len;j++)
	{
		if(s[(ans+j)%len]!=s[(i+j)%len])
			return s[(ans+j)%len] > s[(i+j)%len];
	}
	return 0;
}

int main ()
{
	int i,T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",s);
		int ans = 0;
		len = strlen(s);
		for(i=1;i<len;i++)
		{
			if(fun(ans,i))
				ans = i;
		}
		for(i=0;i<len;i++)
		{
			printf("%c",s[(ans+i)%len]);
		}
		printf("\n");
	}
	return 0;
}

稍加改进以后是直接找出字符串中最小的那一个字符,再看该字符是否出现不止一次

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

char s[105];
int len;
int fun(int ans,int i)
{
	for(int j=0;j<len;j++)
	{
		if(s[(ans+j)%len]!=s[(i+j)%len])
			return s[(ans+j)%len] > s[(i+j)%len];
	}
	return 0;
}

int main ()
{
	int i,T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",s);
		int ans = 0;
		char str = 'Z';
		len = strlen(s);
		for(i=0;i<len;i++)
		{
			if(s[i]<str)
			{
				ans = i;
				str = s[i];
			}
		}	
		for(i=0;i<len;i++)
		{
			if(s[i]==s[ans] && i!=ans)
			{
				if(fun(ans,i))
				{
					ans = i;
				}
			}
		}
		for(i=0;i<len;i++)
		{
			printf("%c",s[(ans+i)%len]);
		}
		printf("\n");
	}
	return 0;
}

因为字符串不是很长,也可以用string来写

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

int main ()
{
	int i,T;
	cin >> T;
	string s;
	while(T--)
	{
		string minn(105,'Z');
		char str = 'Z';
		cin >> s;
		for(i=0;i<s.length();i++)
		{
			if(s[i] < str)
				str = s[i];
		}
		
		for(i=0;i<s.length();i++)
		{
			if(s[i]==str)
			{
				string ans = s.substr(i,s.length()-i) + s.substr(0,i);
				if(ans < minn)
					minn = ans;
			}
		}
		cout << minn << endl;
	}
	return 0;
}

 792B  Counting-out Rhyme

 http://codeforces.com/problemset/problem/792/B

有n个小朋友,编号分别是从1到n,每个小朋友都有当领导的机会,第一次是1号小朋友当领导,下面一行是k个数,每个数用一遍,从当领导的小朋友往后数(领导不算在内)a[i]个,可以把这n个人看成一个循环,到哪个小朋友截至,则这个小朋友要退出游戏,退出的小朋友的后面一个人成为新的领导,知道用完k个数,按顺序输出退出的小朋友的编号。

模拟+vector

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int a[105];
int main ()
{
	vector<int> v;
	int i,n,k;
	cin >> n >> k;
	for(i=1;i<=n;i++)
	{
		v.push_back(i);
	}
	for(i=0;i<k;i++)
	{
		cin >> a[i];
	}
	int pos = 0;
	int j = 0;
	while(k--)
	{
		pos = (pos+a[j++])%v.size();
		cout << v[pos] ;
		if(k)
			cout << " ";
		v.erase(v.begin()+pos);
	}
	cout << endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/86974681