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 }