【洛谷有题】NOIP 2014 提高组初赛试题 订正
网络协议
第 4 题
TCP协议属于哪一层协议( ).
应用层
传输层
网络层
数据链路层
TCP/IP通讯协议采用了 4 层的层级结构,每一层都呼叫下一层所提供的网络来完成自己的需求。
- 应用层:应用程序间沟通的层:SMTP:简单电子邮件传输、FTP:文件传输协议、Telnet:网络远程访问协议、HTTP:超文本传输协议、XMPP:可扩展通讯和表示协议等
- 传输层:节点间的数据传送服务:TCP:传输控制协议、UDP:用户数据报协议等
- 网络层:基本的数据封包传送:如IP
- 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络:Ethernet、SerialLine等
【拓展】那么数据链路层在哪里呢?
其实上面的是4层模型,而还有个5层模型,但只不过是在4层的基础上的“网络接口层”变成了“数据链路层”和“物理层”。
又其实,还有一个7层模型(OSI),又但只不过是5层的基础上的“应用层”变成了三个层:“应用层”,“会话层”和“表示层”;比如HTTP协议就包含在应用层里。
检索/比较次数计算
第 7 题
对长度位n的有序单链表,若检索每个元素的概率相等,则顺序检索到表中任一元素的平均检索长度为( ).
n/2
(n+1)/2
(n-1)/2
n/4
可以用平均数计算。如果元素刚好是第一个那就只要检索1次,若元素是最后一个那就要检索n次,平均(1+n)/2次
第 12 题
同时查找2n 个数中的最大值和最小值,最少比较次数为( ).
3(n-2)/2
4n-2
3n-2
2n-2
你也许以为最简单的是这样的:
1 int a[10010]; 2 int maxn,minn; 3 int n; 4 int main() 5 { 6 cin>>n; 7 for(int i=0;i<2*n;i++) cin>>a[i]; 8 maxn=minn=a[0]; 9 for(int i=1;i<2*n;i++) 10 { 11 if(a[i]>maxn) maxn=a[i]; 12 if(a[i]<minn) minn=a[i]; 13 } 14 return 0; 15 }
比较了4n-2次,(然而本菜鸡把它算成了2n-2所以错了……2n-2突破计算机极限了?!)
或者是这样的:
int a[10010]; int maxn,minn; int n; int main() { cin>>n; for(int i=0;i<2*n;i++) cin>>a[i]; maxn=minn=a[0]; for(int i=1;i<2*n;i++) { if(a[i]>maxn){ maxn=a[i]; } else if(a[i]<minn) minn=a[i]; } return 0; }
平均比较1.5*2*n-2=3n-2,但是此题问的是至少比较次数,也就是最坏情况应该还是4n-2
其实是:
int a[10010]; int maxn,minn; int n; int main() { cin>>n; for(int i=0;i<2*n;i++) cin>>a[i]; if(a[0]<a[1]){ maxn=a[1]; minn=a[0]; } else{ maxn=a[0]; minn=a[1]; } for(int i=2;i<2*n;i+=2) { if(a[i]<a[i+1]) { if(maxn<a[i+1]) maxn=a[a+1]; if(minn>a[i]) minn=a[i]; } else { if(maxn<a[i]) maxn=a[i]; if(minn>a[i+1]) minn=a[i+1] } } return 0; }
啊,真好……
首先外部比较1次。
其次,for循环会循环n-1次(注意步长为2)
每次从数组中取出两个数,先判断这两个数的大小(1次)
然后把大的与maxn比较,把小的与minn比较。(2次)
所以每次循环有三次比较,for中一共有3n-3次
再加上外面的一次,一共有3n-2次。
(以上代码未经过编译的哈,谨慎使用)
over