郑州轻工业学院第八届玲珑杯校赛题解
生活随笔
收集整理的這篇文章主要介紹了
郑州轻工业学院第八届玲珑杯校赛题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
蛤瑋最近學習了關于ip的知識,于是他迫不及待的想把新知識傳授給她的妹子.蛤瑋的妹子隨便寫下了一個字符串,蛤瑋現在要告訴她這個字符串是不是一個合法的ip地址.
為簡單考慮,僅考慮ipv4的情況,即合法ip為形同"a1.a2.a3.a4",且0<=ai<=255。
Input
第一行為一個整數T(1<=T<=20),代表數據組數。接下來T行每行一個字符串,其中不包含空格,Tab以及回車,長度不超過50。
Output
若合法,輸出"Yes",否則輸出"No"(不包含引號)。
Sample Input
210.105.240.51f.a.t.e
Sample Output
YesNo
HINT
我們認為010.105.240.051是合法的。
此題需要考慮的情況有連續出現兩個..的情況、首尾都是..的情況、兩點之間出現非數字的情況(也有可能不是字母是其他的字符)、兩點之間數字個數大于3的情況、小數點的個數不等于3的情況,如此應該就好了,如果還有我沒考慮的情況請聯系我……
如下代碼:
#include<iostream> #include<cstdio> #include<cstring> #include<ctype.h> using namespace std;int main(){int t;while(scanf("%d", &t)!=EOF){while(t--){string str;bool flag=true;int sum=0,node=0,p=0,i;cin>>str;int len=str.size();if(str[0]=='.' || str[len-1]=='.') {puts("No");continue;}for(i=0; i<len; ++i){if(str[i]!='.' && !isdigit(str[i])/*!(str[i]>='0'&&str[i]<='9')*/){flag=false;break;}if(str[i] == '.' && str[i+1] == '.'){flag=false;break;}if(str[i]=='.'){sum=node=0;p++;//判斷小數點個數 }else if(str[i]!='.' && isdigit(str[i])/*str[i]>='0'&&str[i]<='9'*/ ){++node;//判斷數字個數 sum=sum*10+(str[i]-'0');}if(sum<0 ||sum>255||node>3){flag=false;break;} }if(flag && p==3 && i==len)puts("Yes");elseputs("No");}}return 0; }
Description
蛤瑋的妹子過生日,蛤瑋把千辛萬苦挑選出來的禮物送到了妹子面前,然而妹子非常生氣,因為妹子要的是化妝套裝,而蛤瑋買了一套水彩鉛筆,更可氣的是這些鉛筆像是二手的,因為他們不是一樣長!
為了懲罰蛤瑋,妹子說"我有強迫癥,受不了這些鉛筆不一樣長,你快去搞定它!不然就買化妝套給我!".
還好,這些鉛筆的長度都是整數,蛤瑋靈機一動,可以把些鉛筆掰斷使得它們可以一樣長,當然要保證鉛筆盡可能的長。 那么當這些鉛筆最終一樣長的時候,一共有多少支鉛筆?
Input
T(1<=T<=100),表示數據組數.
每組數據第一行一個整數n(1<=n<=100),表示蛤瑋買來的鉛筆個數,接下來一行n個整數,表示n個鉛筆的長度.保證長度都為正整數且小于1e7.
Output
每組數據輸出一行,表示最終的鉛筆個數.
Sample Input
2
2
2 3
3
4 6 14
Sample Output
5
12
HINT
對于第一個輸入,最終掰成了5個長度為1的鉛筆,第二個輸入,最終掰成了12個長度為2的鉛筆。
#include<iostream> #include<cstdio> using namespace std;int GCD(int x, int y) { int t;while(y > 0) {t = x % y;x = y;y = t;}return x; }int main(){int t;int a[105];int n;scanf("%d", &n);while(n--)while(scanf("%d",&t)==1){int s=0,gcd;for(int i=0; i<t; ++i){scanf("%d", &a[i]);s+=a[i];}if(t==1)printf("%d\n", t);else{gcd=GCD(a[0],a[1]);for(int i=2; i<t; ++i){gcd=GCD(gcd, a[i]);}printf("%d\n",s/gcd);}} return 0; }
Description
蛤瑋成為了實驗室主任,現在學校要求他建好一個機房里的通信網絡.這個網絡中有n臺主機,現在已知建設好了m條線路,可以讓一些主機直接或間接通信,為了使這n臺主機互相之間都可以直接或間接通信,請問蛤瑋最少還需建設多少條線路。
間接通信指:若A,B可以直接通信,B,C可以直接通信,則A,C可以間接通信,同理若C,D可以直接通信,A,D也可以間接通信。
Input
輸入第一行為一個整數T(1<=T<=10),代表數據組數。對于每組數據,第一行為兩個整數n(1<=n<=100),m(1<=m<=n*n),接下來m行每行兩個整數u,v(1<=u,v<=n),表示主機u,v之間已建立線路。
Output
對于每組數據,輸出一個整數,表示還需建設的線路數。
Sample Input
13 31 12 11 2
Sample Output
1
用并查集做,記錄合并完之后還剩幾個沒有合并的路線然后減一就好了。 如下代碼:
#include<iostream> #include<cstdio> #include<cstring> #define M 1000+5 using namespace std;int root[M],sz[M]; int count;int find(int p){while(p!=root[p]){root[p]=root[root[p]];/*路徑壓縮,會破壞掉當前節點的父節點的尺寸信息,因為壓縮后,當前節點的父節點已經變了 */ p=root[p];}return p; }void merge(int p, int q){int pRoot=find(p);int qRoot=find(q);if(pRoot == qRoot ) return ;if(sz[pRoot]<sz[qRoot]){// 按秩進行合并,將子樹小的掛在子樹大的上邊 root[pRoot]=qRoot;sz[qRoot]+=sz[pRoot];}else{root[qRoot]=pRoot;sz[pRoot]+=sz[qRoot];}--count; // 每次合并之后,樹的數量減1 }int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d%d", &count, &n);for(int i=1; i<=count; ++i){root[i]=i;sz[i]=1;}for(int i=0; i<n; ++i){int a,b;scanf("%d%d", &a, &b);merge(a, b);}printf("%d\n",count-1);}return 0; }
總結
以上是生活随笔為你收集整理的郑州轻工业学院第八届玲珑杯校赛题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HD 1525 Euclid's Gam
- 下一篇: Java基础篇(03):流程控制语句,和