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\n",r);
44     }
45     fclose(stdin);
46     fclose(stdout);
47     return 0;
48 }

 

posted @ 2016-11-04 21:15  csgc0131123  阅读(658)  评论(0编辑  收藏  举报