一星题
加密
怎么写都只能通过20%的用例,也不知道是我理解错了,还是速度上不去。
题的大意是:第一行输入一个数字告诉你有多少行字符串需要加密,每行字符串不超过50个字符,输入和输出的字符串均是小写字母。
#include <string>
using namespace std;
int main()
{
int n;
string s;
int a[50] = { 1,2,4 };
for (unsigned char i = 3; i < 50; i++)
{
a[i] = a[i - 1] + a[i - 2] + a[i - 3];
a[i] = a[i]%24;
}
cin >> n;
while (n--)
{
cin >> s;
for (size_t i = 0; i < s.size(); i++)
{
s[i] += a[i]%24;
if (s[i] > 'z')
{
s[i] = s[i] - 'z' + 'a' - 1;
}
}
cout << s << endl;
}
return 0;
}
终点可达
原题大意是:一串数字,从第一个开始走,需要几步能够达到最后一个数,返回步数,或者是不能达到,返回-1;第一步的步长最大为
len/2
,后面每一步的步长都是它当前所在位置的数字的大小。
我搞不定输入输出,也没做出来。胡乱写的如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int find(vector<int> &vn, int goal, int maxFirst);
int findMin(vector<int> &vn);
int main()
{
int n;
int goal(0);
int ret(-1);
int maxFirst;
vector<int> vn;
while (cin>>n)
{
vn.push_back(n);
}
goal = vn.size() - 1;
maxFirst = vn.size() / 2;
ret = find(vn, goal, maxFirst);
cout << ret<<endl;
return 0;
}
int find(vector<int> &vn, int goal, int maxFirst)
{
int ret(-1);
vector<int> vns;
for (int i = goal; i >= 0; i--)
{
if (i == 0)
{
i + maxFirst >= goal;
return 1;
}
else if (i + vn[i] == goal)
{
// 这个if里面只有单次能成功的,没有比较,这样得不到最优的
ret = find(vn, i, maxFirst);
if (ret != -1)
{
vns.push_back(ret + 1);
}
}
}
if (vns.size() == 0)
{
return -1;
}
else
{
return findMin(vns);
}
return 0;
}
int findMin(vector<int> &vn)
{
int ret(0);
for (size_t i = 0; i < vn.size(); i++)
{
ret = min(vn[i], ret);
}
return ret;
}
二星题
密码排列
原题大意:给你一堆可能的数字,以及密码的最少位数,要求你写出所有可能的密码组合,且不同的组合间按前面位的数字由小到大输出,每行只输出一个密码。
我一看,同样搞不定输入输出,直接交白卷了。
网友评论