【codeforces】【比賽題解】#861 CF Round #434 (Div.2)
本來是rated,現在變成unrated,你說氣不氣。
鏈接。
【A】k-湊整
題意:
一個正整數\(n\)的\(k\)-湊整數是最小的正整數\(x\)使得\(x\)在十進制下末尾有\(k\)個或更多的\(0\)並且\(n\)整除\(x\)。
舉個例子:\(375\)的\(4\)-湊整數是\(375\cdot80=30000\)。\(30000\)是最小的整數使得末尾有\(4\)個及以上的\(0\),並且能被\(375\)整除。
試求出\(n\)的\(k\)-湊整數。
輸入:
一行,兩個正整數\(n,k(1\leq n\leq10^9,0\leq k\leq 8)\)。
輸出:
一個整數,\(n\)的\(k\)-湊整數。
題解:
算出\(n\)中的\(2\)和\(5\)質因數的個數。註意精度。
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 int n,n2,k,t,f,t2,f2; 5 int main(){ 6 scanf("%d%d",&n2,&k); n=n2; 7 while(!(n2%2)) n2/=2, ++t; 8 while(!(n2%5)) n2/=5, ++f; 9 t2=0<k-t?k-t:0; 10 f2=0<k-f?k-f:0; 11 printf("%I64d",(long long)n*(int)(pow(2,t2)+0.5)*(int)(pow(5,f2)+0.5)); 12 return 0; 13 }
【B】哪層樓?
題意:
在Polycrap住的大樓中,每層有相等的公寓數量。不幸的是,Polycrap並不知道每層樓有多少間公寓,但是他記得這些公寓從\(1\)開始從低層編號到高層。就是說,前幾間公寓在第一層,接下來幾間在第二層等等。Polycrap不記得總共有多少間公寓,所以你可以認為大樓無窮高(就是說有無數層樓,有無數間公寓)。註意樓層從\(1\)開始編號。
Polycrap記得某些公寓在幾樓。保證這些信息不互相矛盾。意思是一定存在這樣的大樓滿足Polycrap的信息。
給定這些信息,有辦法確定\(n\)號公寓的確切樓層嗎?
輸入:
第一行,兩個數\(n,m(1\leq n\leq100,0\leq m\leq100)\)。\(n\)表示你要尋找樓層的公寓,\(m\)表示Polycrap所知道的公寓數量。
接下來\(m\)行,每行兩個數\(k_{i},f_{i}(1\leq k_{i},f_{i}\leq100)\),表示第\(k_{i}\)間公寓在第\(f_{i}\)層樓,所有的\(k_{i}\)互不相同。
輸出:
如果能確定\(n\)號公寓在哪一層,輸出這個層數,否則輸出-1。
題解:
難點在於不是要確定一層有幾間公寓,而是要確定第\(n\)間公寓在哪一層,這是不同的。
我們可以先確定可能的每層公寓數的最大值和最小值,這可以直接枚舉。而如果對於最大值和最小值,\(n\)號公寓所在樓層都是一樣的,那麽可以確定一定是這層樓,否則無法確定。
1 #include<cstdio> 2 int n,m,k[1000],f[1000],ans1=0,ans2=0; 3 int main(){ 4 scanf("%d%d",&n,&m); 5 for(int i=1;i<=m;++i) scanf("%d%d",k+i,f+i); 6 for(int i=1,o=1;i<=100;++i,o=1){ 7 for(int j=1;j<=m&&o==1;++j) if((k[j]-1)/i+1!=f[j]) o=0; 8 if(o&&!ans1) ans1=i; 9 if(o) ans2=i; 10 } 11 if((n-1)/ans1+1==(n-1)/ans2+1) printf("%d",(n-1)/ans1+1); 12 else puts("-1"); 13 return 0; 14 }
【C】你的意思是……?
題意:
Beroffice文本編輯器有很多特色,其中之一是自動尋找並更正拼寫錯誤。
Beroffice的這一功能只針對小寫字母。Beroffice認為一個單詞有拼寫錯誤就意味著單詞中有三個連續的輔音字母。唯一的例外是這三個字母是相同的,如果這樣,這一大塊字母都沒有拼寫錯誤,不管這一段有多長。準確的說,一個單詞有拼寫錯誤當且僅當有三個及以上的連續輔音字母,並且這些輔音字母不完全相同。
舉個例子:
這些單詞有拼寫錯誤:“hellno”,“hackcerrs”和“backtothefuttttre”。
這些單詞沒有:“helllllooooo”,“tobeornottobe”和“oooooo”。
如果Beroffice找到了一個有拼寫錯誤的單詞,它會在這個詞中加上盡量少的空格(把它分成若幹個單詞)使得每一部分都不含有拼寫錯誤。
輸入:
一個字符串,只包含小寫字母,長度在\(1\)到\(3000\)以內。
輸出:
如果這個單詞沒有拼寫錯誤,直接輸出,否則輸出這個字符串插入若幹空格後的字符串。
題解:
貪心,找到了拼寫錯誤就斷開。
#include<cstdio> char str[3002],lst1,lst2; const bool c[26]={0,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1}; int main(){ scanf("%s",str); lst1=lst2=-1; for(int i=0;str[i]!=‘\0‘;++i){ // printf("%d %d\n",lst1,lst2); str[i]-=‘a‘; if(!c[str[i]]) lst1=lst2=-1; else if(lst1!=-1&&lst2!=-1&&(!(lst1==lst2&&lst2==str[i]))) putchar(‘ ‘), lst1=lst2=-1; printf("%c",str[i]+‘a‘); lst1=lst2; lst2=c[str[i]]?str[i]:-1; } return 0; }
【codeforces】【比賽題解】#861 CF Round #434 (Div.2)