书上具体所有题目:http://pan.baidu.com/s/1hssH0KO

代码:(Accepted,0 ms)

//UVa1590 - IP Networks
#include<iostream>
unsigned i, m, num, ip[4], ipmax[4], ipmin[4], mask[4];
int cmp(unsigned *a, unsigned *b) {//compare
for (int i = 0;i < 4;++i) {
if (a[i] < b[i]) return -1;
if (a[i] > b[i]) return 1;
}
return 0;
} int main()
{
//freopen("in.txt", "r", stdin);
while (scanf("%d", &m) != -1) {
scanf("%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]);
for (i = 0;i < 4;++i) ipmax[i] = ipmin[i] = ip[i];
while (--m) {
scanf("%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]);
if (cmp(ip, ipmax) == 1)
for (i = 0;i < 4;++i) ipmax[i] = ip[i];
else if (cmp(ip, ipmin) == -1)
for (i = 0;i < 4;++i) ipmin[i] = ip[i];
}
for (i = 0;i < 4;++i) {
if (i == 0 || mask[i - 1] == 255) {
mask[i] = 255 ^ (ipmax[i] ^ ipmin[i]);
for (int j = 0;j <= 8;++j)
if ((mask[i] >> j) == (255 >> j)) {
mask[i] = ((mask[i] >> j) << j);
break;
}
}
else mask[i] = 0;
}
printf("%u.%u.%u.%u\n", mask[0] & ipmax[0], mask[1] & ipmax[1], mask[2] & ipmax[2], mask[3] & ipmax[3]);
printf("%u.%u.%u.%u\n", mask[0], mask[1], mask[2], mask[3]);
}
return 0;
}

分析:网上他们说这是水题ToT。。。他们说只要知道点IP地址的知识就行了。。。然而我并不知道。。。于是看那英文的题目也没细说ip地址与子网掩码的规则,就自己查了好久子网掩码和ip地址的转化规则,其实到现在也仅仅是“好像懂了”,却竟然做出来了,不知道是开心还是不开心。而且之前我也没学过按位运算,这次竟然自己摸索着运用的还可以。

IP地址与子网掩码转化规则如下:(假设ip地址为a,a 的子网掩码为b,图个打字方便)

a与b(每一段分别)按位与,就得到它的smallest possible IP network

如果a1、a2、a3……分别与b“按位与”运算均得到一个答案,那么说明这些电脑全在一个子网里。

而现在要求已知很多地址,且知道他们在一个子网里,让你求smallest possible IP network和子网掩码。那么其实只要知道最大最小两个ip就行。于是找出最大最小,ipmax和ipmin。然后看ipmax和ipmin从哪一位(二进制)开始不同,从不同的那一位开始,那些电脑就是在同一个子网里了,于是可以求得子网掩码。我的算法是,最大最小两个ip进行异或运算,目的是找出第一个开始不一样的地方,然后再与1111 1111(二进制,即255)异或运算,相当于取反,但是这里不能直接使用取反运算“~”,因为一个unsigned有32位,会使得比1111 1111高位的0也取反。于是得到子网掩码的雏形。而子网掩码前n位连续为1,后32-n位连续为0,这个雏形仅仅办到了前n位为1,所以得想办法把后32-n位清零。于是用了这个方法

                for (int j = 0;j <= 8;++j)
if ((mask[i] >> j) == (255 >> j)) {
mask[i] = ((mask[i] >> j) << j);
break;
}

再根据子网掩码和随意一个ip按位与,就得到smallest possible IP network。

(应该没说错吧)

[刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  5. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  6. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  7. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

  8. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  9. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. csvkit---python一个牛逼到不行的csv处理库

    先吐槽一下:不管是百度还是谷歌,查来查去除了官方文档之外就没有任何可以借鉴的例子,虽然官方文档写的挺好的.但是我一直以为是在python语言的方式运行的,结果是以命令行的方式运行的,搞得我还以为这个库 ...

  2. salesforce中soql及sosl的伪‘Like’模糊检索

    salesforce里有soql.sosl两种查询语法,soql针对模糊搜索也有‘like’关键字,然而只能针对其自带字段如:Name.Id:对于自定义添加的字段如:Message__c.Note__ ...

  3. SVG动画-基础篇

    参考资料: http://www.w3school.com.cn/svg/index.asp https://msdn.microsoft.com/zh-cn/library/gg193979 简介 ...

  4. MYSQL优化_MYSQL分区技术[转载]

    MySQL分区技术是用来减轻海量数据带来的负担,解决数据库性能下降问题的一种方式,其他的方式还有建立索引,大表拆小表等等.MySQL分区按照分区的参考方式来分有RANGE分区.LIST分区.HASH分 ...

  5. 老李分享:Android -自动化埋点 2

    除了上述的事件,Android提供了一个OnTouchListener的监听器,当事件传递到控件的时候,如果控件注册了这个监听器,则会执行监听器中的onTouch方法.同时,如果它返回true,则事件 ...

  6. Android内存优化之OOM

    内容大多都是和OOM有关的实践总结概要.理解错误或是偏差的地方,还请多包涵指正,谢谢!本人Q:1524447071 (一)Android的内存管理机制 Google在Android的官网上有这样一篇文 ...

  7. Android多渠道打包

    项目需要,简单2步实现(由于简单,所以对大量渠道打包不是最优的),比如1000个渠道同时打包的话可能花费的时间会过长.不过目前该方法能满足绝大需求了...根据截图一步一步走: 第一步 设置配置清单文件 ...

  8. java 解压 zip 包并删除

    需求是这样的,  在服务器上有 运营上传的zip 包,内容是用户的照片,我需要做的是 获取这些照片上传,并保存到 数据库. 这里面的 上传照片,保存数据库都不难,主要问题是解压zip包,和删除zip ...

  9. 1136: 零起点学算法43——多组测试数据输出I

    1136: 零起点学算法43--多组测试数据输出I Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: ...

  10. 浅谈C#数组(二)

    六.枚举集合 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中元素的个数.foreach语句使用一个枚举器.foreach会调用实现了IEnumerable接口的集合类中的Get ...