刷题打卡2 UVa1590,UVa508, UVa509

来源:互联网 发布:百川环评工程师软件 编辑:程序博客网 时间:2024/05/20 06:31

题目 4

IP网络(IP Networks,UVa1590)

https://cn.vjudge.net/problem/UVA-1590

思路及参考代码http://blog.csdn.net/hahaac/article/details/52649997(感谢dalao)委屈,看了好久看懂了点点)

思路:

ip的四个部分分别处理,每一部分找出最大值的最小值,然后判断是其二进制最后几位不同,得出子网掩码;
用任意一个IP与子网掩码进行按位与运算得出最小IP

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10000+10;int dns_table[9]={255,254,252,248,240,224,192,128,0};int ip[4][maxn];int main(){int m;while(~scanf("%d",&m)){memset(ip,0,sizeof(ip));int dns[4];int minip[4];for(int i=0;i<m;i++){scanf("%d.%d.%d.%d",&ip[0][i],&ip[1][i],&ip[2][i],&ip[3][i]);}for(int i=0;i<4;i++){int dir=0;int j;sort(ip[i],ip[i]+m);int p=ip[i][m-1];int q=ip[i][0];for(j=1;j<=8;j++){if(p%2!=q%2) dir=j;p/=2;q/=2;}dns[i]=dns_table[dir];minip[i]=ip[i][0]&dns[i];}for(int i=0;i<4;i++){if(dns[i]!=255){for(i=i+1;i<4;i++){dns[i]=0;minip[i]=0;}break;}}printf("%d.%d.%d.%d\n",minip[0],minip[1],minip[2],minip[3]);printf("%d.%d.%d.%d\n",dns[0],dns[1],dns[2],dns[3]);}return 0;} 


题目 5

莫尔斯电码(Morse Mismatches, UVa508)(map)

https://cn.vjudge.net/problem/UVA-508

思路及代码参考http://www.cnblogs.com/dwtfukgv/p/5572356.html(感谢dalao)

思路:

首先先把每个字母做一个map,

然后把字典做一个map,最后输入时暴力一下,每个都找一下,这个增加字符可以这样想,就是在和字典比较时,短的在长的字符串中,

截取和短的一样的长度的字符串相等,那么就只要比较长的比短的长多少就行了,最后取一个最短的就OK了。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<map>using namespace std;const int INF=0x3f3f3f;// 关于无穷大0x3f3f3f的一些知识map<char,string>morse;map<string,string>dic;int judge(string a,string b){if(a==b) return 0;//相等if(a.size() >b.size() ) swap(a,b);//保证a的长度小于b的长度if(a==b.substr(0,a.size())) return b.size()-a.size();//如果a和b的前一段一样,那么就可以正价或删减字符使他们一样,返回长度差return INF;//如果不一样,那就不能通过增加或删除使他们一样,那么就返回最大值 } string solve(const string &s){string ans="";int mmin=INF;//初始化for(map<string,string>::iterator it=dic.begin();it !=dic.end();it++){int d=judge(s,it->second);if(!d&&!mmin&&*ans.rbegin()!='!'){ans+="!";return ans;}//说明精确匹配了 两次,直接返回就OK了else if(d<=mmin) ans=it->first;//不精确匹配mmin=min(d,mmin); } if(mmin) ans+="?";//如果不是精确匹配return  ans; } int main(){string s,ch;while(cin>>ch&&ch!="*"){cin>>s;morse[ch[0]]=s;//构造字符map }while(cin>>s&&s!="*"){for(int i=0;i<s.size();i++)dic[s]+=morse[s[i]];//构造字典 }while(cin>>s&&s!="*")cout<<solve(s)<<endl;return 0; }

题目 6

RAID技术(RAID!, ACM/ICPC World Finals 1997, UVa509)

https://cn.vjudge.net/problem/UVA-509

思路及代码参考http://blog.csdn.net/thudaliangrx/article/details/50700688(感谢dalao)

代码:

#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<algorithm>using namespace std;const int D=6;const int S=64;const int B=100;int main(){int kase = 0;    int d, s, b, e;    char data[D][S*B+1];    while (scanf("%d", &d) && d) {        char c[2];        scanf("%d%d%s", &s, &b, c);        e = (c[0] == 'E') ? 0 : 1;        for (int i = 0; i < d; i++)            scanf("%s", data[i]);bool flag = true;        for (int i = 0; i < b; i++) {            for (int j = i*s; j < (i+1)*s; j++) {                int cntx = 0;                int x = d;                int num = 0;                for (int k = 0; k < d; k++) {                    if (data[k][j] == 'x') {                        cntx++;                        x = k;                    } else                        num ^= (data[k][j] - '0');                }                if (cntx > 1 || x == d && num != e) { flag = false; break;}                if (x < d) data[x][j] = (num ^ e) + '0';            }            if (flag == false) break;        }if (flag == false) {            printf("Disk set %d is invalid.\n", ++kase);            continue;        }        int n=0;        char res[(D-1)*S*B+4];        for(int i=0;i<b;i++){        int p=i%d;        for(int k=0;k<d;k++){        if(k==p) continue;        strncpy(res+n,data[k]+i*s,s);//把data[k]+i*s所指向的字符串中以前s个字节复制到res+n所指的数组中,并返回res+n        n+=s;} }while(n%4) res[n++]='0';res[n]='\0'; printf("Disk set %d is valid, contents are: ", ++kase);        for (int i = 0; i < n; i += 4) {            int m = 0;            for (int j = i; j < i+4; j++)                m = m*2 + res[j] - '0';            printf("%c", (m < 10) ? m+'0' : m-10+'A');        }        printf("\n");}return 0;}






————越努力,越幸运BYyingying





原创粉丝点击