文章

5

粉丝

0

获赞

25

访问

1.8k

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

#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 操作的范围出错。

以下是修正后的代码:

#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;
            // 清空b向量
            b.clear();
            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()+a.size()/2);
            else reverse(a.begin(),a.begin()+(a.size()-1)/2);
        }
        for(i=0;i<n;i++){
            if(i!=n-1) cout<<a[i]<<" ";
            else cout<<a[i];
        }
        cout<<endl;
    }
    return 0;
}

 

赞(1)

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

2025年3月21日 18:54