1 条题解

  • 0
    @ 2025-2-14 21:11:41

    C :

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #define N 10010
    struct Node
    {
        double begin;
        double end;
    
    }node[N];
    
    int cmp(const void *a,const void *b)
    {
        if((*(struct Node *)a).begin!=(*(struct Node *)b).begin)
          return (*(struct Node *)a).begin>(*(struct Node *)b).begin ?1:-1;
        else
          return (*(struct Node *)a).end >(*(struct Node *)b).end ?1:-1;
    }
    int main()
    {
        int i,n,k,w,h,x,ncase,ans;
        double R,t,r,max,p;
        scanf("%d",&ncase);
        while(ncase--)
        {
            int flag=1;
            memset(node,0,sizeof(node));
            scanf("%d%d%d",&n,&w,&h);
            R=(double) h/(2*1.0) ;
            t=(double)h*h/(4*1.0);
            k=0;
            for(i=0;i<n;i++)
            {
                scanf("%d%lf",&x,&r);
                if(r>R)
                {
                  r=sqrt(r*r-t);
                  node[k].begin=x-r;
                  if(node[k].begin<0) node[k].begin=0;
                  node[k].end=x+r;
                  if(node[k].end>w) node[k].end=w;
                  k++;
                }
                else
                  continue;
            }
            qsort(node,k,sizeof(node[0]),cmp);
            ans=0;
            p=0;
            i=0;
            while(p<w)
            {
                max=0;
                for(i;node[i].begin<=p&&i<k;i++)
                {
                    if(node[i].end-p>=max)
                     max=node[i].end-p;
                }
                if(!max)
                {
                    flag=0;
                    break;
                }
                p+=max;
                ans++;
            }
            if(!flag)
            {
                printf("0\n");
            }
            else
            {
                printf("%d\n",ans);
            }
    
        }
        return 0;
    }
    
    
    

    C++ :

    
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    struct ps
    {
    	double left;//**左交点**//
    	double right;//**右交点**//
    }w[10001];
    bool comp(ps a,ps b)//**还是按照左交点的大小进行排序**//
    {
    	if(a.left<b.left) return true;
    	return false;
    }
    int main()
    {
    	int ncases,n,i,width,high,x,r,count,flag;
    	double len,sum,max;
    	scanf("%d",&ncases);
    	while(ncases--)
    	{
    		flag=1;sum=0;count=0;
    		scanf("%d %d %d",&n,&width,&high);
    		for(i=0;i<=n-1;i++)
    		{
    			scanf("%d %d",&x,&r);
    			len=(double)r*r-(double)high/2*high/2;
    			if(len>=0) {len=sqrt(len);}//**以前把这布直接并入到sqrt(len),结果忘了len可以小于0,一直WA**//
    			if(len<0) {len=0;}//**覆盖不到,这个长度就可以忽略掉**//
    			w[i].left=x-len;
    			w[i].right=x+len;
    		}
    		sort(w,w+n,comp);
    		while(sum<width)//**关键思想**//
    		{
    			max=0;//**代表比前一个装置能够辐射的范围往右延长的最大值**//
    			for(i=0;i<=n-1&&w[i].left<=sum;i++)//**w[i].left<=sum保证两个碰水装置可以相交,也就是说两点直接的能够完全覆盖**//
    			{
    				if((w[i].right-sum)>max)//**找出既能保证完全覆盖又能保证这点能够达到的右交点最大,即需要的喷水装置最少**//
    				{
    					max=w[i].right-sum;//**找出最大值**//
    				}
    			}
    			if(max==0)//**说明w[i].left>sum,表示其中一个点的右交点跟另外一个点的左交点没有连接上,即不能完全覆盖**//
    			{
    				flag=0;
    				break;
    			}
    			else
    			{
    				sum=sum+max;//**更新能够覆盖的宽度**//
    				count++;
    			}
    		}
    		if(flag==1)
    		{
    			printf("%d\n",count);
    		}
    		else
    		{
    			printf("0\n");
    		}
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    706
    时间
    3000ms
    内存
    64MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者