A:
思路:
只需要每个值出现的次数,然后找出现的数的个数,与k进行判断即可。
代码:
#include<iostream>
#include<string.h>
using namespace std;
int n,k,ans,sum;
string s;
int a[10];
int main()
{
ios::sync_with_stdio(false);
cin >> n >> k;
while(n--)
{
memset(a,0,sizeof(a));
cin >> s;
if(k>10)
{
ans++;
continue;
}
for(int i=0;i<s.size();i++)
{
a[s[i]-'0']++;
}
sum=0;
for(int i=0;i<10;i++)
{
if(a[i]!=0)
sum++;
}
if(sum<k)
ans++;
}
cout << ans;
}
B
思路:
将每个节点与其他节点的距离都求出来,然后找最大距离最小的,即为最终的半径,然后找出最小的x,y值即可。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
double x,y,xx[1010],yy[1010],ans=1e11,minn;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>xx[i]>>yy[i];
for(int i=1;i<=n;i++)
{
minn=0;
for(int j=1;j<=n;j++)
{
if(j==i) continue;
double tmp=((xx[i]-xx[j])*(xx[i]-xx[j]))+((yy[i]-yy[j])*(yy[i]-yy[j]));
minn=max(minn,tmp);
}
if(ans>minn)
{
x=xx[i];
y=yy[i];
ans=minn;
}
else if(ans==minn)
{
if(x>xx[i])
{
x=xx[i];
y=yy[i];
}
else if(x==xx[i])
{
if(y>yy[i])
{
x=xx[i];
y=yy[i];
}
}
}
}
printf("%0.2lf %0.2lf\n%0.2lf",x,y,ans);
return 0;
}
C
思路:
使用区间dp进行计算,f[i][j]代表i与j之间能否构成二叉搜索树,f[i][k]和f[k][j]均能构成二叉搜索树,则由于区间是连续递增的,两个区间结合起来就形成了以k为根节点的二叉搜索树。第一层循环枚举区间长度,0~n-1(区间长度为0时表示只有一个点,区间长度为n-1时表示整个区间)。然后开始枚举区间的起始位置,根据区间长度得到区间的结束位置。最后枚举区间中的根节点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,a[1010];
bool f[1010][1010],flag[1010][1010];
bool l[1010][1010],r[1010][1010];
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
int main()
{
cin>>T;
while(T--)
{
memset(f,0,sizeof f);
memset(l,0,sizeof l);
memset(r,0,sizeof r);
memset(flag,0,sizeof flag);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
l[i][i]=r[i][i]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) continue;
else if(gcd(a[i],a[j])>1)
flag[i][j]=true;
for(int len=0;len<n;len++)
for(int u=1;u+len<=n;u++)
{
int v=u+len;
for(int k=u;k<=v;k++)
if(l[u][k]&&r[k][v])
{
f[u][v]=1;
if(flag[u-1][k]) r[u-1][v]=1;
if(flag[k][v+1]) l[u][v+1]=1;
}
}
if(f[1][n]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}