题意:给出一个数组,找出一个最小的整数使得数组中的所有元素模这个整数的得数各不相同。
思路:暴力
注意:如果用memset的话,数组不要开太大了,1000000的时候再用memset就被卡超时了。可以用一个数组保存更改了那些元素,然后再依次改回来。
错误:前面没有在每一组数据开始的时候对记录的数组进行初始化,导致了一直tle。后来改成memset,因为数组开大了导致tle。
代码如下:
#include<cstdio>
#include<iostream>
#include<set>
#include<cstring>
using namespace std;
int s[1000];
bool have[100001];
int cnt[400];
int tot=0;
int main(){
// freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--){
for(int i=0;i<tot;++i){
have[cnt[i]]=0;
}
tot=0;
int g;
scanf("%d",&g);
for(int i=0;i<g;++i){
scanf("%d",&s[i]);
}
int fin=0;
int rec=1;
while(!fin){
for(int i=0;i<tot;++i){
have[cnt[i]]=0;
}
tot=0;
fin=1;
for(int i=0;i<g;++i){
int tmp=s[i]%rec;
if(have[tmp]){
fin=0;break;
}
have[tmp]=1;
cnt[tot++]=tmp;
}
if(!fin)rec++;
else break;
}
printf("%d\n",rec);
}
return 0;
}
用memset的方式:
#include<cstdio>
#include<cstring>
int s[30500];
bool have[100001];
int i;
int main(){
// freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--){
int g;
scanf("%d",&g);
for(i=0;i<g;++i){
scanf("%d",&s[i]);
}
bool fin=1;
int rec;
for(rec=1;rec<1000005;rec++){
memset(have,0,sizeof(have));
fin=1;
for(i=0;i<g;++i){
int tmp=s[i]%rec;
if(have[tmp]){fin=0;break;}
have[tmp]=1;
}
if(fin)break;
}
printf("%d\n",rec);
}
return 0;
}