zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    协程greenlet与gevent模块
    进程通信和数据共享两种方式
    创建进程的两个方式
    queue队列吃包子
    queue队列是并发利器
    创建线程方式
    threading线程进程
    socketserver实现多用户并发聊天
    socket实现图片读取
    ZYB's Biology
  • 原文地址:https://www.cnblogs.com/c1299401227/p/6031654.html
Copyright © 2011-2022 走看看