csp201712-2游戏
自己用list实现的,但是只有50分,请教各位,麻烦帮我看看程序哪里出了问题···能想到的测试用例都通过了···官网只给结果分数,不给评测用例,感觉没啥问题,请指教!!!感激不尽!!!
#include <iostream>
#include <list>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
list<int> plist;
for(int i=1;i<=n;++i){
plist.push_back(i);
}
list<int>::iterator it=plist.begin();
int count =1;
while(plist.size()>1){
while(1){
it++;
count++;
if(it==plist.end()){
it = plist.begin();
}
if(count%k==0||count%10==k){
break;
}
}
it = plist.erase(it);
count++;
if(it==plist.end()){
it = plist.begin();
}
}
cout<<plist.front();
return 0;
}
找到问题啦!!!
循环里面我count++了之后判断它是不是满足条件,但是循环外面因为erase之后它指向下一位,我不得不把count++,但是这个加了之后的count可能还是会满足条件,亦有可能被删除,但是我这里忽略了这个。
更改后的代码:
#include <iostream>
#include <list>
#include <queue>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
list<int> plist;
for(int i=1;i<=n;++i){
plist.push_back(i);
}
list<int>::iterator it=plist.begin();
int count =1;
while(plist.size()>1){
it++;
count++;
if(it==plist.end()){
it = plist.begin();
}
while((count%k==0||count%10==k)){
it = plist.erase(it);
count++;
if(it==plist.end()){
it = plist.begin();
}
}
}
cout<<plist.front();
return 0;
}
官网测试90分···运行错误···
初步怀疑是因为在里面循环的时候把元素都erase了,.front()就指针异常了。
但是在内部循环时加了长度判断,代码如下:
#include <iostream>
#include <list>
#include <queue>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
list<int> plist;
for(int i=1;i<=n;++i){
plist.push_back(i);
}
list<int>::iterator it=plist.begin();
int count =1;
while(plist.size()>1){
it++;
count++;
if(it==plist.end()){
it = plist.begin();
}
while((count%k==0||count%10==k)&&plist.size()>1){
it = plist.erase(it);
count++;
if(it==plist.end()){
it = plist.begin();
}
}
}
cout<<plist.front();
return 0;
}
官网测试90分,但是报错变成了 错误···
十分疑惑,求解答,应该如何改动?
终于AC了!!!
换了个角度改了一下代码,更简洁,也正确了。
下面是100分代码:
#include <iostream>
#include <list>
#include <queue>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
list<int> plist;
for(int i=1;i<=n;++i){
plist.push_back(i);
}
list<int>::iterator it=plist.begin();
int count =1;
while(plist.size()>1){
if(count%k==0||count%10==k){
it = plist.erase(it);
count++;
if(it==plist.end()){
it = plist.begin();
}
}
else{
it++;
count++;
if(it==plist.end()){
it = plist.begin();
}
}
}
cout<<plist.front();
return 0;
}
虽然只是解决了一点点小问题,但还是非常开心。
该问题是约瑟夫问题的变体,挺经典的一道题,稍微改动一下,就可以变很多花样,改动而且改正确自己原有的代码也显得尤为重要。
附提交记录:
一点进步就弥足珍贵啦!!继续加油!