版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
稍加改进以后是直接找出字符串中最小的那一个字符,再看该字符是否出现不止一次
扫描二维码关注公众号,回复:
5350918 查看本文章
#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;
}