擒贼擒王

题目传送门

这个题目是粗心搞错了

样例数据太弱了

我的思路是正解,但是求答案的时候顺序搞反了。

错误代码如下

#include<bits/stdc++.h>
using namespace std;
#define int long long

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

int n,k,a[100001],b[100001];

void solve(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
    for(int i=1;i<=n;i++){
        if(b[i]<=0) continue;
        b[i]=b[i]-((b[i]+k-1)/k)*k;
    }
    sort(b+1,b+n+1);
    int ans1=0,ans2=1;
    for(int i=2;i<=n;i++){//ans2是对的
        if(b[i]!=b[i-1]) ans2++;    
    }
    int mx=-1ll<<60ll;
    for(int i=1;i<=n;i++){//ans1是错的,因为b已经拍过序了,所以答案永远是n,是不对的
        if(b[i]>=mx) mx=b[i],ans1=i;
    }
    cout<<ans1<<' '<<ans2<<endl; 
}
 
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    freopen("qin.in","r",stdin);
    freopen("qin.out","w",stdout);
    int q=1;
    //cin>>q; 
    while(q--)
        solve();
}

只需要先求ans1,然后排序,再求ans2,就对了

代码如下

#include<bits/stdc++.h>
using namespace std;

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}

long long n,k,a[100001],b[100001];

void solve(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
    for(int i=1;i<=n;i++){
        if(b[i]<=0) continue;
        b[i]=b[i]-((b[i]+k-1)/k)*k;
    }
    long long ans1=0,ans2=1;
    long long mx=LLONG_MIN;
    for(int i=1;i<=n;i++){
        if(b[i]>=mx) mx=b[i],ans1=i;
    }
    sort(b+1,b+n+1);
    for(int i=2;i<=n;i++){
        if(b[i]!=b[i-1]) ans2++;    
    }
    cout<<ans1<<' '<<ans2<<endl; 
}
 
int main(){
    cin.tie(0)->sync_with_stdio(0);
    freopen("qin.in","r",stdin);
    freopen("qin.out","w",stdout);
    int q=1;
    //cin>>q; 
    while(q--)
        solve();
}

ok

0 条评论

目前还没有评论...