2016.10.29 NOIP模拟赛 PM 考试整理

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

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

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

1.开始的序列是没法消除的(这与题目描述明显不符啊),即便有不少能够连消的,而个人程序每次只在插入的位置向两侧寻找能够消除的,天然就错了。blog

2.开始时的序列竟然能够为空,真是让人措手不及!get

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

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:it

 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\n",r);
44     }
45     fclose(stdin);
46     fclose(stdout);
47     return 0;
48 }
相关文章
相关标签/搜索