擒贼擒王

题目传送门

这个题目是粗心搞错了

样例数据太弱了

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

错误代码如下

#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

posted @ 2026-01-24 12:00  zhangruotian_Max  阅读(2)  评论(0)    收藏  举报