40道选择(40分)
2道编程 (60分)
1. 队尾幸运编号
时间限制:C/C++语言 1000MS;其他语言 3000 MS
内存限制:C/C++ 语言65536KB;其他语言 589824KB
题目描述
N个人排成一队,从1到5轮流报数,报5的人是幸运者,出列。报到队尾后,从队首接着报。依此循环。
问:排在队尾的人是第几名幸运者?
注:N为小于100000的正整数。
例如:
1人排成一队,他就是第1名幸运者。
3人排成一队,队尾是第2名幸运者。
5人排成一队,队尾是第1名幸运者。
8人排成一队,队尾是第3名幸运者。
即求:N人排成一队,队尾是第多少名幸运者?
输入
队伍总人数
输出
队尾者的幸运编号
样例输入
20
样例输出
4
程序C++
此思路来源于 算法竞赛入门经典的 救济金发放(UVa133),只是注意输出的值不一样。
这里可以用num记录队尾的人是第几次才输出,也可以用一个数组记录每次弹出的幸运者编号,直到弹出队尾编号;
用数组的好处是可以看到弹出的幸运者编号;
#include <bits/stdc++.h>
const int maxn=100005;
int f[maxn];
int n;
using namespace std;
int go(int p,int d,int t)
{
while(t--)
{
do{
p=(p+d+n-1)%n+1;
}while(f[p]==0);
}
return p;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
f[i]=i;
vector<int> pep;//存储幸运者编号
int left=n;//剩下的人数
int p=0; //注意这里p的取值要为0 因为go函数中我们使用的是t-- 而不是--t
int num=0;
while(left)
{
num++;
p=go(p,1,5);
pep.push_back(p);
f[p]=0;
left--;
if(p==n)
break;
}
// for(int i=0;i<pep.size();i++)
// {
// cout << pep[i] <<' ';
// }
// cout <<endl;
cout << "num is :"<<num << endl;
cout << "pep.size():" <<pep.size()<< endl;
return 0;
}
2. 求最长不重复字符子串
时间限制:C/C++语言 1000MS;其他语言 3000 MS
内存限制:C/C++ 语言65536KB;其他语言 589824KB
题目描述
输入一行字符串,求里面不含有重复字符的最长子串。
比如输入字符串为aaabbacccc,可以从任意位置开始截取子字符串,
这些子字符串中,不含有重复字符的最长子字符串是abc,它的长度是3。
输入
字符串
输出
不含有重复字符的最长子串长度
样例输入
bcdbcdee
样例输出
4
程序C++
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int LengthofLongeststring(string s)
{
int m[256]={0};
int left=0,ans=0;
for(int i=0;i<s.size();i++)
{
if(m[s[i]]==0 || m[s[i]]<left)
{
ans=max(ans,i-left+1);
}
else
{
left=m[s[i]];
}
m[s[i]]=i+1;
}
return ans;
}
int main()
{
string s;
getline(cin,s);
int ans;
ans=LengthofLongeststring(s);
cout << ans <<endl;
return 0;
}
版权声明:本文为qq_40161242原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。