- 分享
- @ 2025-10-16 08:26:29
这个题目是粗心搞错了
样例数据太弱了
我的思路是正解,但是求答案的时候顺序搞反了。
错误代码如下
#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 条评论
目前还没有评论...