1327: 2019年内蒙古自治区第十四届大学生程序设计竞赛-自闭

题目描述
世界上的大佬太多了,菜鸡们纷纷自闭并来到心理诊所寻求治疗,心理诊所的每一个医生有不同的开始上班时间,能力 a 和收费 c,能力为 a 的医生可以治好自闭程度小于或等于 a 的菜鸡。菜鸡们都很穷,所以他们只想要能治好他们的最便宜的医生,请你告诉他们当前能治好他们病的最便宜的医生的价格。(假设治疗在瞬间完成,同一个医生可以连续接待任意个客人)

输入
第一行一个正整数 T(T<=5),表示数据的组数

每组数据第一行一个正整数 n(n <= 10^5),表示接下来有 n 行。

接下来 n 行中,若第一个数为 0,则接下来两个正整数 a,c 表示有一个能力为 a,收费为 c 的医生上班了。若第一个数为 1,则接下来有一个正整数 b,表示有一个自闭程度为 b 的菜鸡来寻求治疗(1<=a,b,c <= 10^9)。

输出
对每个寻求治疗的菜鸡,输出一个整数表示治疗需要的花费,如果没有医生能治好他,输出“-1”。

样例输入
1
8
1 19
0 17 5
0 1 6
1 12
1 15
0 5 7
0 3 9
1 3
样例输出
-1
5
5
5`

这道题当时卡了赛区99.99%的小伙伴,好像最后只有一人做出。
考点在于对时间复杂度的掌控。
可以这么想,保存一个能力大收费也低的医生作为输入门槛,可以过滤掉大批“要能力没能力还TM收费贵”的医生,并且可以为患者最快的找到能力大收费也低的医生,这一点可以大幅度简化时间复杂度。

#include <stdio.h>
#define M 1000000005
double a[100005],c[100005];
int main()
{ int T,P,n,k,i;
  double N,F,Max,Min,Minn,b;
  while(scanf("%d",&T)!=EOF){
  while(T--)
  {
      scanf("%d",&n);
      memset(a,0,sizeof(a));//很好用的数组初始化;
      memset(c,0,sizeof(c));
      Max=0;
      Min=M;
      k=2;
      while(n--)
      {
         scanf("%d",&P);
         if(P==0)
         {
             scanf("%lf%lf",&N,&F);
             if(N>=Max && F<=Min)
                {
                    Max=N;
                    Min=F;
                    a[1]=N;
                    c[1]=F;
                }
             else if(N<Max && F>Min) //这个else用的特别特别精髓
                continue ;
             else
             {  a[k]=N;
                c[k]=F;
                  k++;
             }
         }
         else
         {
           Minn=M;
           scanf("%lf",&b);
           for(i=1;i<k;i++)
           {
               if(b<a[i])
                 if(Minn>c[i])
                   Minn=c[i];
           }
           if(Minn==M) printf("-1\n");
           else printf("%.0lf\n",Minn);
         }
 
      }
  }
  }
    return 0;
}
 

代码不是很优,但是目前CSDN上比较简单的C语言基础版,适合刚刚入门C语言的同学,有不懂的地方或者可以优化的方法欢迎评论。

发布了33 篇原创文章 · 获赞 8 · 访问量 1830

猜你喜欢

转载自blog.csdn.net/HJS1453100406/article/details/103212283