郑州轻工业学院第八届玲珑杯校赛题解
生活随笔
收集整理的這篇文章主要介紹了
郑州轻工业学院第八届玲珑杯校赛题解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
蛤瑋最近學(xué)習(xí)了關(guān)于ip的知識,于是他迫不及待的想把新知識傳授給她的妹子.蛤瑋的妹子隨便寫下了一個字符串,蛤瑋現(xiàn)在要告訴她這個字符串是不是一個合法的ip地址.
為簡單考慮,僅考慮ipv4的情況,即合法ip為形同"a1.a2.a3.a4",且0<=ai<=255。
Input
第一行為一個整數(shù)T(1<=T<=20),代表數(shù)據(jù)組數(shù)。接下來T行每行一個字符串,其中不包含空格,Tab以及回車,長度不超過50。
Output
若合法,輸出"Yes",否則輸出"No"(不包含引號)。
Sample Input
210.105.240.51f.a.t.e
Sample Output
YesNo
HINT
我們認(rèn)為010.105.240.051是合法的。
此題需要考慮的情況有連續(xù)出現(xiàn)兩個..的情況、首尾都是..的情況、兩點之間出現(xiàn)非數(shù)字的情況(也有可能不是字母是其他的字符)、兩點之間數(shù)字個數(shù)大于3的情況、小數(shù)點的個數(shù)不等于3的情況,如此應(yīng)該就好了,如果還有我沒考慮的情況請聯(lián)系我……
如下代碼:
#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++;//判斷小數(shù)點個數(shù) }else if(str[i]!='.' && isdigit(str[i])/*str[i]>='0'&&str[i]<='9'*/ ){++node;//判斷數(shù)字個數(shù) 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
蛤瑋的妹子過生日,蛤瑋把千辛萬苦挑選出來的禮物送到了妹子面前,然而妹子非常生氣,因為妹子要的是化妝套裝,而蛤瑋買了一套水彩鉛筆,更可氣的是這些鉛筆像是二手的,因為他們不是一樣長!
為了懲罰蛤瑋,妹子說"我有強(qiáng)迫癥,受不了這些鉛筆不一樣長,你快去搞定它!不然就買化妝套給我!".
還好,這些鉛筆的長度都是整數(shù),蛤瑋靈機(jī)一動,可以把些鉛筆掰斷使得它們可以一樣長,當(dāng)然要保證鉛筆盡可能的長。 那么當(dāng)這些鉛筆最終一樣長的時候,一共有多少支鉛筆?
Input
T(1<=T<=100),表示數(shù)據(jù)組數(shù).
每組數(shù)據(jù)第一行一個整數(shù)n(1<=n<=100),表示蛤瑋買來的鉛筆個數(shù),接下來一行n個整數(shù),表示n個鉛筆的長度.保證長度都為正整數(shù)且小于1e7.
Output
每組數(shù)據(jù)輸出一行,表示最終的鉛筆個數(shù).
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
蛤瑋成為了實驗室主任,現(xiàn)在學(xué)校要求他建好一個機(jī)房里的通信網(wǎng)絡(luò).這個網(wǎng)絡(luò)中有n臺主機(jī),現(xiàn)在已知建設(shè)好了m條線路,可以讓一些主機(jī)直接或間接通信,為了使這n臺主機(jī)互相之間都可以直接或間接通信,請問蛤瑋最少還需建設(shè)多少條線路。
間接通信指:若A,B可以直接通信,B,C可以直接通信,則A,C可以間接通信,同理若C,D可以直接通信,A,D也可以間接通信。
Input
輸入第一行為一個整數(shù)T(1<=T<=10),代表數(shù)據(jù)組數(shù)。對于每組數(shù)據(jù),第一行為兩個整數(shù)n(1<=n<=100),m(1<=m<=n*n),接下來m行每行兩個整數(shù)u,v(1<=u,v<=n),表示主機(jī)u,v之間已建立線路。
Output
對于每組數(shù)據(jù),輸出一個整數(shù),表示還需建設(shè)的線路數(shù)。
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]];/*路徑壓縮,會破壞掉當(dāng)前節(jié)點的父節(jié)點的尺寸信息,因為壓縮后,當(dāng)前節(jié)點的父節(jié)點已經(jīng)變了 */ 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]){// 按秩進(jìn)行合并,將子樹小的掛在子樹大的上邊 root[pRoot]=qRoot;sz[qRoot]+=sz[pRoot];}else{root[qRoot]=pRoot;sz[pRoot]+=sz[qRoot];}--count; // 每次合并之后,樹的數(shù)量減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; }
總結(jié)
以上是生活随笔為你收集整理的郑州轻工业学院第八届玲珑杯校赛题解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HD 1525 Euclid's Gam
- 下一篇: HD 1003 Max Sum(贪心)