A - TT数鸭子
-
题目
-
思路
只要它给定一个多位数字,计算这个数字中有多少个不同的数字,再和k比较即可。 -
注意点
此题的时间卡的很死,最好做一些优化。加上这一行std::ios::sync_with_stdio(false);就可以使得cin、cout的时间和scanf、printf接近。 -
代码
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);//这个可以大幅提高大数据的输入和输出以节省时间
int n, k;
cin >> n >> k;
int ans = 0;
string x;
for (int i = 0; i < n; i++)
{
cin >> x;
bool c[10] = { false };
int len = x.size();
for (int i = 0; i < len; i++)
{
c[x[i] - '0'] = true;
}
int cnt = 0;
for (int i = 0; i < 10; i++)
{
if (c[i])cnt++;
}
if (cnt < k)ans++;
}
cout << ans;
}
B - ZJM要抵御宇宙射线
- 题目
- 思路
遍历每个点,计算每个点到其他的点的最大距离,然后找出这些点中最大距离最小的点,就是原点,它的最大距离,就是半径的平方。 - 注意点
最后输出结果是半径的平方,不是半径。因为半径的平方可能会比较大,所以数据类型应该是longlong。还有最后输出要保留两位小数。 - 代码
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
struct node{
long long x,y;
long long z;//此点到其他点的最大距离
}nd[1010];
int cmp(node n1,node n2){
if(n1.z !=n2.z)return n1.z<n2.z;
else{
if(n1.x!=n2.x)return n1.x<n2.x;
else{
if(n1.y!=n2.y)return n1.y<n2.y;
}
}
}
int main(){
int n;cin>>n;
for(int i=0;i<n;i++){
long long xx,yy;cin>>xx>>yy;
nd[i].x=xx;nd[i].y=yy;
nd[i].z=0;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
long long mm=(nd[i].x-nd[j].x)*(nd[i].x-nd[j].x)+(nd[i].y-nd[j].y)*(nd[i].y-nd[j].y);
if(mm>nd[i].z)nd[i].z=mm;
}
//ut<<nd[i].z<<endl;
}
sort(nd,nd+n,cmp);
cout<<nd[0].x<<".00 "<<nd[0].y<<".00"<<endl;
cout<<nd[0].z<<".00"<<endl;
return 0;
}
C - 宇宙狗的危机
- 题目
- 思路
此题应该是动态规划,用区间dp来做就可以了。
用数组f[i][j]取1时表示i~j可以构成一棵二叉搜索树 ;
若i~j可以构成一棵二叉搜索树,那么可以构成以i或者以j为根的二叉树;
所以若f[i][k]和f[k][j]均能构成二叉搜索树,那么i-j就可以构成以k为根的二叉树 ,f[i][j]=1; - 代码
#include<iostream>
#include<cstring>
using namespace std;
bool f[710][710],flag[710][710],l[710][710],r[710][710];//f[i][j]取1时表示i~j可以构成一棵二叉搜索树
int a[710];//a表示二叉树的n个元素
int gcd(int a,int b){//计算gcd
return b == 0 ? a : gcd(b,a%b);
}
void init(){
memset(f,0,sizeof(f));
memset(flag,0,sizeof(flag));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
}
int main(){
int t;cin>>t;
while(t--){
init();
int n;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 i=0;i<n;i++){
for(int j=1;j+i<=n;j++){
int k=i+j;
for(int u=j;u<=k;u++){
if(l[j][u]&&r[u][k]){
f[j][k]=1;
if(flag[j-1][u])r[j-1][k]=1;
if(flag[u][k+1])l[j][k+1]=1;
}
}
}
}
if(f[1][n])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}