输入首先给出一个正整数N(≤),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。
针对每条指令,给出相应的信息:
1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。
这个题目如果用map会非常简单,否则就要用hash实现。
这里我是通过一个简单的结构体数组实现的。
根据题目要求我们创建一个结构体
struct Account { char command; string qq; string key; }a[100000];
在主函数中,把输入的“N”和“L”单独拿出来做调用函数的判断。若为“L”则调用与登录相关的函数,否则调用与创建相关的函数。
对于每次的创建和登录,都需要判断一下账号是否已经存在,因此,在单独创建一个判断函数来判断。在这个函数中,我们需要与之前存储过的内容相比较,因此要把当前的循环数也传进去。
int check(Account a[], int n,string qqt) { for (int i = 0; i <= n; i++) { if (qqt == a[i].qq)return i;//如果能在a数组中找到账号,则返回下标 } return -1;//若退出循环则证明没找到 }
接下来进入与“N”有关的函数。不论是调用创建函数还是登录函数,在传参的时候都要把当前的循环数传进去。在这个函数中先调用check函数判断账号是否存在,若不存在,则将账号密码写入当前循环数的数组中
void Create(Account a[], int n) { string qqt; string keyt; cin >> qqt >> keyt;//将当前的两个字符串输入 if (check(a, n, qqt) >= 0) {//返回值大于0代表可以在a数组中找到账号 cout << "ERROR: Exist" << endl; return; } a[n].qq = qqt; a[n].key = keyt;//若退出循环则证明账号不存在,将存储的两个字符串存入a数组,代表创建账号 cout << "New: OK" << endl; return; }
与“L”有关的函数同理,只不过稍微复杂一点。
bool Login(Account a[], int n) { string qqt; string keyt; cin >> qqt >> keyt; if (check(a, n, qqt) == -1) {//判断账号是否存在 cout << "ERROR: Not Exist" << endl; return false; } if (check(a, n, qqt) >= 0) {//判断密码是否正确 int x = check(a, n, qqt);//将账号下标回传给x if (keyt == a[x].key) { cout << "Login: OK" << endl; return true; } } cout << "ERROR: Wrong PW" << endl;//若退出循环则表明账号存在但是密码不正确 return false; }
在写完这几个函数之后基本就大功告成了。拿去pta上跑,会发现sample毫无意外的过了。但是后面两个监测点都会超时,因此需要对代码进行优化。首先对代码进行检查,很容易发现,超时点位于check函数,因为每次调用check函数都要比较n遍,所以当数组开到十的五次方的时候就会超时。然后就优化就好啦
原文:https://www.cnblogs.com/chengcanwang/p/10962035.html