文章

5

粉丝

0

获赞

23

访问

696

头像
我这个为什么只对85%数据,有大佬指点一下吗
P1366 吉林大学机试题
发布于2025年3月21日 17:49
阅读数 181

#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0,k=0;
while(cin>>n>>k){
int i=0;
vector<int>a(n);
vector<int>b;
for(i=0;i<n;i++){
    a[i]=i+1;
}
for(i=0;i<k;i++){
    int x=0,l=0;
    cin>>x;
    for(int j=x;j<n;j++){
       b.push_back(a[j]);
    }
    for(int j=0;j<x;j++){
        b.push_back(a[j]);
    }
    a=b;
    if(a.size()%2==0)reverse(a.begin(),a.begin()+n/2);
    else reverse(a.begin(),a.begin()+(n-1)/2);
}
for(i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}

登录查看完整内容


登录后发布评论

2 条评论
快乐小土狗
2025年3月21日 18:23

b 向量未清空:在每次 shift 操作前,没有对 b 向量进行清空。这样会使得之前操作的元素一直保留在 b 里,进而引发结果错误。

reverse 操作的范围有误:在 reverse 操作时,使用的是 n 而非 a.size() 来计算前半部分的范围。因为在 shift 操作后,a 的元素顺序改变了,但 n 并未改变,所以这会导致 reverse 操作的范围出错。

以下是修正后的代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int n=0,k=0;
  5. while(cin>>n>>k){
  6. int i=0;
  7. vector<int>a(n);
  8. vector<int>b;
  9. for(i=0;i<n;i++){
  10. a[i]=i+1;
  11. }
  12. for(i=0;i<k;i++){
  13. int x=0,l=0;
  14. cin>>x;
  15. // 清空b向量
  16. b.clear();
  17. for(int j=x;j<n;j++){
  18. b.push_back(a[j]);
  19. }
  20. for(int j=0;j<x;j++){
  21. b.push_back(a[j]);
  22. }
  23. a=b;
  24. if(a.size()%2==0) reverse(a.begin(),a.begin()+a.size()/2);
  25. else reverse(a.begin(),a.begin()+(a.size()-1)/2);
  26. }
  27. for(i=0;i<n;i++){
  28. if(i!=n-1) cout<<a[i]<<" ";
  29. else cout<<a[i];
  30. }
  31. cout<<endl;
  32. }
  33. return 0;
  34. }

 

赞(1)

无123456 : 回复 快乐小土狗: 谢谢大佬,但是n不是一直等于a.size()吗?为什么改了就对啊。后来我把x变为了x%n就对了是不是他的x有可能大于n了

2025年3月21日 18:54