草体にぼ日記

だらだらと

12月8日 精進録

12月8日

 まえがき

自作PCを一応直したのですが、ブルースクリーンが連発して困り困り。困り でした。

で、最終的にデュアルブートをしてUbuntuで作業しています。 しかしまあ・・・ 辛いっすね。。

そんなわけで昨日一昨日と環境構築に時間を費やしてしまい全然精進することができない!!って感じだった

まじでまじでまじっでさああああああああああああああ!!!!!!!!!!!!11 僕怒っちゃうよ 

さて、じゃあ今日の精進録

  • 解いた問題

ABC010C-浮気調査

ARC029 A-高橋くんとお肉

C - Digits in Multiplication

ABC010C-浮気調査

problem

解法

メンヘラの気持ちになれば解ける。

入力例1がすべてを語っている。 高橋くんの初期位置から、女の子の家の距離をA 女の子の家から高橋くんの最終位置までの距離をBとしたときに A+Bがt*vより小さくなればYES。 高橋くんは浮気をしています(断定)

いや浮気も何も付き合ってないからいいじゃないですか…!!

コードは貼りません。

一言

ダブル型を使おうね

ARC029 A-高橋くんとお肉

problem

解法

むずくない?n=1,2,3,4で場合分けしてやろうか(脳死)ってして、写経ACなんだけどよくわかってない

4つの肉をどっちの肉焼き器で焼くかで場合分け。 2 ^ 4 = 16通りを全探索 写経ACなのでコードは貼りませんが、bit全探索の部分だけ解説をはさみます

 int ret = 1000;
    for(int mask = 0 ; mask <( 1 << n ) ; mask++){
        int t[2] ={};
        rep(i,n) t[(mask>>i)&1]+=T[i]; // mask が3のとき0011で、0番目1番目はビットが立っているのでt[1]に入れる
 
        ret = min(ret,max(t[0],t[1]));
    }

forの()の中、24 = 16通りを試したいというのが mask < ( 1 << n ) で示せている 1 << n ;は、1の左シフトでn =4 のとき 1 0000 って、1を左に四回動かしていて、maskが1111になるまでやってくれってことなんですね。

次にmaskが1010のとき、1個めと3個目の肉焼き器 で焼くようにするという処理が

int t[2] = {};
rep(i,n) t[(mask >> i) & 1] += T[i];

に込められています

n = 4 であるとして、i = 0 から 3 まで見ていきます

i = 0 のとき mask (1010) >> 0 = 1010 & 1

1010 と1(0001と見たほうが良い)のand を取って0 なのでt[0] += T[0] ;//0個目の肉の焼く時間はt[0]へ加える

i = 1 のとき  mask (1010) >> 1 = 0101 & 1

0101と1 ( 0001 )のandを取って1 ( 0001) なのでt[1] += T[1] //1個めの肉の焼く時間はt[1]へ加える

i = 2 のとき  mask (1010) >> 2 = 0010 & 1

0010と1 ( 0001 )のandを取って1 ( 0000) なのでt[0] += T[2] //2個めの肉の焼く時間はt[0]へ加える

i = 3 のとき  mask (1010) >> 3 = 0001 & 1

0001と1 ( 0001 )のandを取って1 ( 0001) なのでt[1] += T[3] //3個めの肉の焼く時間はt[1]へ加える

以上のようにして0個目と2個めの肉を焼く時間がt[0]、1個めと3個めの肉を焼く時間がt[1]へ入りました。 t[0]とt[1]の大きい方が、全体として焼き終わる時間。これを「各ビットごとの焼く時間」と言います。 

0000から1111までやっていって、「各ビットごとの焼く時間」の最小値を出力しましょう

難しいですね…

C - Digits in Multiplication

problem

int getKeta(ll x){
    int count = 0 ;
    while(x > 0){
        count ++;
        x /= 10 ;
    }
    return count ;
}
 
 
const int mod = 1e9+7;
int main()
{
    cin >> n; 
    ll ans = 1;
    for(ll i = 1 ; i * i <= n ; i++){
        if(n % i != 0)continue;
        ans = n / i ;
    }
    //ansの桁数をゲットする
    int A = getKeta(ans);
    cout << A << endl;
}
解法

N = A * B となるようにAとBをイジイジするとき、 AとBはできるだけ近い値にしたいです 例えば N = 100だったら

A = 1 , B = 100 とするよりも A=10 ,B=10 とするのが良い。

Nを2つの因数で表したとき、小さい方をAとすると A <= root(N);です

制約は 1<= N <= 1010 なので、Aを1からrootNまで試していって、 一番Aが大きいときのBの桁数を出力します

これ似たような問題です。僕は溶けませんでした 例題