• 2016.10.29 NOIP模拟赛 PM 考试整理


    300分的题,只得了第三题的100分。

    题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how

    T1:这道题目存在着诸多的问题:

    1.开始的序列是无法消除的(这与题目描述明显不符啊),即使有很多可以连消的,而我的程序每次只在插入的位置向两侧寻找可以消除的,自然就错了。

    2.开始时的序列居然可以为空,真是让人措手不及!

    3.一些很特殊的玩法:比如AAABBCCC,在4处打上B,B消除之后,后面的C撞到了A,C有3个,消除,但是A却不消除!!!(意思是在这种情况下,只管后面的。

    T2:

     1 /*
     2 思路:分析题目可以知道:如果当前的栈为空或者栈顶元素小于还没进栈元素的最大值时,应该使元素进栈,直到最大值进栈;否则,栈顶元素出栈。 
     3 我的错误:思路是正确的,但是敲代码的时候出现了错误,我把未进栈的max与栈中的max进行了比较,但是应该是把未进栈的max与栈顶进行比较这样比较出来,才是最大的。因为栈中的max不能被立刻输出的。 
     4 为了预防再出现这样的错误:以后有了思路的题目,都要先敲出伪代码.....
     5 */
     6 #define N 1000010
     7 #include<iostream>
     8 using namespace std;
     9 #include<cstdio>
    10 int n,num[N],maxnum=0,maxsta=0;
    11 int sta[N],topt=0;
    12 int read()
    13 {
    14     int ret=0;
    15     char s=getchar();
    16     while(s<'0'||s>'9') s=getchar();
    17     while(s>='0'&&s<='9')
    18     {
    19         ret=ret*10+s-'0';
    20         s=getchar();
    21     }
    22     return ret;
    23 }
    24 void input()
    25 {
    26     n=read();
    27     for(int i=1;i<=n;++i)
    28        num[i]=read();
    29 }
    30 int main()
    31 {
    32     freopen("haha.in","r",stdin);
    33     freopen("haha.out","w",stdout);
    34     input();
    35     maxnum=n;
    36     int i=1;
    37     while(i<=n)
    38     {
    39         if(maxnum>sta[topt])
    40         {
    41             for(;i<=n;++i)
    42             {
    43                 if(maxnum==num[i])
    44                 {
    45                     printf("%d ",num[i]);
    46                     i++;
    47                      break;
    48                 }
    49                 sta[++topt]=num[i];
    50             }
    51             maxnum=0;
    52             for(int j=i;j<=n;++j)
    53               maxnum=max(maxnum,num[j]);
    54         }
    55         else{
    56                 printf("%d ",sta[topt]);
    57                 topt--;    
    58         }
    59     }
    60     while(topt>=1) printf("%d ",sta[topt--]);
    61     fclose(stdin);
    62     fclose(stdout);
    63     return 0;
    64 }

    T3:

     1 /*
     2 二分+一定的数学判断:
     3 为了能够使这些边不相交,那么肯定是小联小,大连大了。
     4 二分这些线段,用数学方法判断点在直线的哪一边?(不会的请自行百度,初中知识)
     5 */
     6 #define N 200010
     7 #include<iostream>
     8 using namespace std;
     9 #include<cstdio>
    10 #include<algorithm>
    11 int n,x0[N],y0[N],m;
    12 void input()
    13 {
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;++i)
    16       scanf("%d",&x0[i]);
    17     for(int i=1;i<=n;++i)
    18       scanf("%d",&y0[i]);
    19     scanf("%d",&m);
    20     sort(x0+1,x0+1+n);
    21     sort(y0+1,y0+1+n);
    22 }
    23 double panduan(int k,int x,int y)
    24 {
    25     return (double)((1.0*y0[k]*x/x0[k]+1.0*y-1.0*y0[k]));
    26 }
    27 int main()
    28 {
    29     freopen("hahaha.in","r",stdin);
    30     freopen("hahaha.out","w",stdout);
    31     input();
    32     int x,y;
    33     for(int i=1;i<=m;++i)
    34     {
    35         scanf("%d%d",&x,&y);
    36         int l=1,r=n;
    37         while(l<=r)
    38         {
    39             int mid=(l+r)>>1;
    40             if(panduan(mid,x,y)>=0) l=mid+1;
    41             else r=mid-1; 
    42         }
    43         printf("%d
    ",r);
    44     }
    45     fclose(stdin);
    46     fclose(stdout);
    47     return 0;
    48 }
  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/c1299401227/p/6031654.html
Copyright © 2020-2023  润新知