A枚舉
#include <iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
using namespace std;
int judge(int x)
{
int f[20],g=0;
memset(f,0,sizeof(f));
while(x)
{
g++;
int k = x%10;
x/=10;
if(!f[k])
f[k] = 1;
else
return 0;
}
return 1;
}
int main()
{
int i,j,k,n;
cin>>n;
for(i = n+1 ; ;i++)
{
if(judge(i))
{
cout<<i<<endl;
break;
}
}
return 0;
}
--------------------------------------------------------------------------------
B 枚舉+二分
#include <iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
using namespace std;
#define N 100010
int pr[N],pd[N],ma[510][510],pg[N],g;
void prime()
{
int i,j;
pr[1] = 1;
for(i = 2 ; i < N ; i++)
{
if(!pr[i])
{
for(j = i+i ; j < N ; j+=i)
if(!pr[j])
pr[j] = 1;
}
}
for(i = 2; i < N ; i++)
if(!pr[i])
{
pd[g++] = i;
}
}
int judge(int x)
{
int i,low =0,high=g-1,mid = (low+high)/2;
while(low<high)
{
if(pd[mid]>x)
{
high = mid-1;
}
else
low = mid+1;
mid = (low+high)/2;
}
for(i = mid ; ;i++)
if(pd[i]>x)
break;
return pd[i]-x;
}
int main()
{
int i,j,k,n,m;
prime();
cin>>n>>m;
for(i = 1; i <= n ; i++)
for(j = 1; j <= m ; j++)
cin>>ma[i][j];
int mi = 10*N;
for(i = 1 ; i <= n ; i++)
{
int s=0;
for(j = 1; j <= m ; j++)
{
if(pr[ma[i][j]]!=0)
s+=judge(ma[i][j]);
}
if(s<mi)
mi = s;
}
for(i = 1; i <= m ; i++)
{
int s = 0;
for(j = 1; j <= n ; j++)
{
if(pr[ma[j][i]])
s+=judge(ma[j][i]);
}
if(s<mi)
mi = s;
}
cout<<mi<<endl;
return 0;
}
C 集合元素最少爲3個 元素之間不能構成等差數列
#include <iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#define N 1000010
using namespace std;
int num[N],f[N];
int main()
{
int i,j,k,n,o;
cin>>n>>k;
if(n/k>=3)
{
int g = 1;
num[1] = 1;
num[2] = 1;
num[5] = 1;
f[5] =1;
for(i = 3; i <= 3*k-6 ; i++)
{
if(!f[i])
{
g++;
num[i] = g;
num[i+1] = g;
num[i+5] = g;
f[i] = 1;
f[i+1] = 1;
f[i+5] = 1;
}
}
num[3*k] = k;
num[3*k-2] = k;
num[3*k-3] = k;
for(i = 3*k+1 ; i <= n ; i++)
num[i] = k;
for(i = 1; i < n ; i++)
cout<<num[i]<<" ";
cout<<num[n]<<endl;
}
else
cout<<"-1\n";
return 0;
}
--------------------------------------------------------------------------------