华为OJ刷题(称砝码,两个IP是否是同一子网)

来源:互联网 发布:新人网络男主播技巧 编辑:程序博客网 时间:2024/05/16 12:38

1 称砝码(用动态规划即可解决)

#include<iostream>#include<string>#include<set>using namespace std;#define M 99int fama(int n,int*weight,int * nums);int main(){int n;int weight[M]={0},nums[M]={0};cin>>n;for(int i=0;i<n;++i)cin>>*(weight+i);for(int i=0;i<n;++i)cin>>*(nums+i);int number=0;number=fama(n,weight,nums);cout<<number<<endl;//system("pause");return 0;}int fama(int n,int* weight,int * nums){set<int> iset;int sum=0;for( int i=0;i<n;++i)sum+=*(weight+i)**(nums+i);iset.insert(sum);set<int>::iterator it;for(int i=0;i<n;++i){it=iset.begin();while(it!=iset.end()){for(int k=1;k<=*(nums+i)&&*it-k**(weight+i)>0;++k)iset.insert(*it-k**(weight+i));it++;}}iset.insert(0);return iset.size();}



2 判断两个IP是否属于同一子网(方法比较low,把IP分段处理)

#include<iostream>#include<string>using namespace std;int checkNetSegment(string,string,string);int segment(string,int*);int main(){string mask,ip1,ip2;cin>>mask;cin>>ip1;cin>>ip2;int label=checkNetSegment(mask,ip1,ip2);cout<<label<<endl;//system("pause");return 0;}int checkNetSegment(string mask,string ip1,string ip2){int mseg[4],seg1[4],seg2[4],label=0;int rcheck=segment(mask,mseg);if(rcheck==1)return 1;rcheck=segment(ip1,seg1);if (rcheck==1)return 1;rcheck=segment(ip2,seg2);if (rcheck==1)return 1;for (int i=0;i<4;++i){seg1[i]&=mseg[i];seg2[i]&=mseg[i];label+=((seg1[i]-seg2[i])==0);}if (label==4)return 0;elsereturn 2; } int segment(string s,int* seg){int pos=0;int i=0;int tmpip;while((pos=s.find_first_of('.'))!=-1&&i<4){ string tmp(s.begin(),s.begin()+pos);tmpip=atoi(tmp.c_str());s.erase(s.begin(),s.begin()+pos+1);pos=0;if (tmpip<0||tmpip>255)return 1;seg[i++]=tmpip;}tmpip=atoi(s.c_str());if(tmpip<0||tmpip>255)return 1;seg[3]=atoi(s.c_str());return 0;}


0 0
原创粉丝点击