1. 程式人生 > >【codeforces】【比賽題解】#861 CF Round #434 (Div.2)

【codeforces】【比賽題解】#861 CF Round #434 (Div.2)

ans 插入 dot 文本編輯 cst http utc 表示 div

本來是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)