csp-M4

A-TT数鸭子

问题描述:
在这里插入图片描述
思路:
这道题用字符串来解答,计算每个中不同数字的个数若是超标则直接pass

#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int A[10];
int main(int argc, char** argv) 
{
	int n,k,re=0;
	long long int x;
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		for(int k=0;k<10;k++)
		{
			A[k]=0;
		 } 
		int y=0;
		scanf("%lld",&x);
		while(x!=0)
		{
			A[x%10]++;
			if(A[x%10]==1)y++;
			x/=10;
			if(y>=k)break;
		}
		if(y<k)re++;
	}
	printf("%d",re);
	return 0;
}

B宇宙射线

问题描述:
在这里插入图片描述

思路:

这道题刚开始看错了,没有看见中心位于某个射线的起点上,当成了最小覆盖圆问题来解答,结果得了0分(惨痛的教训)
按照题意的话就直接枚举就行了

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int n;
long long int a,b,c;
struct node
{
	long long int x,y,z;
	bool operator <(const node &f)const
	{
		if(z!=f.z)return z<f.z;
		else if(x!=f.x)return x<f.x;
		else if(y!=f.y)return y<f.y;
	}
}A[1005];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>A[i].x>>A[i].y;
	}
	for(int i=0;i<n;i++)
	{
		a=0;
		for(int k=0;k<n;k++)
		{
			b=pow((A[i].x-A[k].x),2);
			c=pow((A[i].y-A[k].y),2);
			a=max(a,b+c);
		}
		A[i].z=a;
	}
	sort(A,A+n);
	printf("%lld.00 %lld.00\n%lld.00",A[0].x,A[0].y,A[0].z);
}

C宇宙狗的危机

问题描述:
在这里插入图片描述

思路:
这道题用到了区间dp,很难想到的,后来还是室友说可以用Dp来写,才反应过来
B[i][j]表示的时j的左孩子可以为区间[i,j],C表示的一样不过说的右孩子
然后枚举每一种情况确定是否成立

#include <iostream>
#include<string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int A[777],B[777][777],C[777][722],D[777][711];

int gg(int a,int b)
{
	if(b==0)return a;
	return gg(b,a%b);
}
int main(int argc, char** argv) 
{
	int l,n;
	cin>>l;
	while(l--)
	{
		bool ans=true;
		cin>>n;
		memset(B,0,sizeof(B));
		memset(C,0,sizeof(C));
		memset(D,0,sizeof(D));
		for(int i=1;i<=n;i++)
		{
			cin>>A[i];
			B[i][i]=C[i][i]=1;
		}
		for(int i=1;i<=n;i++)
		{
			for(int k=1;k<=n;k++)
			{
				D[i][k]=gg(A[i],A[k]);
			}
		}
		for(int ll=n;ll>=1;ll--)
		{
			for(int r=ll;r<=n;r++)
			{
				for(int k=ll;k<=r;k++)
				{
					if(B[ll][k]&&C[k][r])
					{
						if(ll==1&&r==n)
						{
							ans=false;
						}
						if(D[ll-1][k]>1)
						{
							C[ll-1][r]=1;
						}
						if(D[k][r+1]>1)
						{
							B[ll][r+1]=1;
						}
					}
					
				}
			}
		}
		if(ans)cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值