2015年百度之星程序设计大赛 - 资格赛 (1003 IP聚合)

【题目链接】:cilck here~~

【题目大意】:

当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址。网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如:

子网掩码:A.B.C.D

IP 地址:a.b.c.d

网络地址:(A&a).(B&b).(C&c).(D&d)

本来比较简单的一道题,排序处理一下就可以了,由于bool cmp函数写错了,调试了一下午,还是写的太少~~

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
struct node
{
    int a1,a2,a3,a4;
} ip[N],ans[N],res[N];
bool cmp(node a,node b)
{
    if(a.a1!=b.a1) return a.a1<=b.a1;
    if(a.a2!=b.a2) return a.a2<=b.a2;
    if(a.a3!=b.a3) return a.a3<=b.a3;
    if(a.a4!=b.a4) return a.a4<=b.a4;
}
int main()
{
    int t,tot=1,n,m;
    cin>>t;
    while(t--)
    {
        memset(res,0,sizeof(res));
        cin>>n>>m;
        for(int i=1; i<=n; i++) scanf("%d.%d.%d.%d",&ip[i].a1,&ip[i].a2,&ip[i].a3,&ip[i].a4);
        for(int i=1; i<=m; i++) scanf("%d.%d.%d.%d",&ans[i].a1,&ans[i].a2,&ans[i].a3,&ans[i].a4);
        int k=0;
        printf("Case #%d:\n",tot++);
        for(int i=1; i<=m; i++)
        {
            int c=0,cnt=0;
            for(int j=1; j<=n; j++)
            {
                res[k].a1=ip[j].a1&ans[i].a1;
                res[k].a2=ip[j].a2&ans[i].a2;
                res[k].a3=ip[j].a3&ans[i].a3;
                res[k].a4=ip[j].a4&ans[i].a4;
                k++;
            }
            sort(res+k-n,res+k,cmp);
            for(int j=k-n; j<k; j++)
            {
                if((res[j].a1==res[j+1].a1)&&(res[j].a2==res[j+1].a2)&&(res[j].a3==res[j+1].a3)&&(res[j].a4==res[j+1].a4))
                    c++;
            }
            printf("%d\n",n-c);
        }
    }
    return 0;
}


你可能感兴趣的:(百度之星,比赛题)