Codeforces Round #796 (Div. 2) B Patchouli‘s Magical Talisman
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #796 (Div. 2) B Patchouli‘s Magical Talisman
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
廣藿香正在制作一個神奇的護身符。 她最初有 n 個魔法令牌。 它們的魔力可以用正整數a1,a2,…,an來表示。 廣藿香可以對令牌執行以下兩種操作。 融合:廣藿香選擇兩個標記,移除它們,并創造一個新的標記,其魔力等于兩個所選標記之和。 減少:廣藿香選擇一個具有偶數魔法力量 x 值的令牌,將其移除并創建一個具有等于 x2 魔法力量的新令牌。 當它們的魔力是奇數時,令牌會更有效。 請幫助廣藿香找出她需要的最少操作次數,以使所有代幣的魔力為奇數。
思路:
操作+貪心
目的是要操作次數最少,貢獻是操作次數。觀察可知減少一個偶數融合操作最多操作一次,而減少操作最少操作兩次,因此我們極端化的想,讓融合操作盡可能多。然而還有其他的一些約束條件:只有當奇數+偶數時結果才為奇,因此融合操作只有當數組內存在奇數時才能操作,因此如果數組中存在奇數,那么總操作數就是偶數的個數。如果數組中全是偶數,那么只能進行減少操作。操作次數就是不斷將該數除2,直到該數為奇數為止,因此減少操作的操作次數與bit有關。我們只需找出除2除到奇數的最少操作的那個偶數,然后貢獻就是除法操作數+偶數個數-1。
一開始WA了一發,因為以為數越小,除法的操作就越少,但事實上并不是這樣
Code:
#include <bits/stdc++.h> using namespace std; const int mxn=2e5+10,mnf=0x3f3f3f3f; #define int long long int n,ok=0,cnt=0,cnt2=0,ans=0,mi=mnf; int a[mxn]; void solve(){ok=0;cnt=0;cnt2=0;ans=0;mi=mnf;scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);if(a[i]%2==0) cnt++;else ok=1;}//sort(a+1,a+1+n);if(ok) {printf("%lld\n",cnt);return;}else{for(int i=1;i<=n;i++){cnt2=0;while(a[i]%2==0){a[i]>>=1;cnt2++;}mi=min(mi,cnt2);}}ans=cnt-1+mi;printf("%lld\n",ans); } signed main(){int T;scanf("%lld",&T);while(T--) solve();return 0; }總結
以上是生活随笔為你收集整理的Codeforces Round #796 (Div. 2) B Patchouli‘s Magical Talisman的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻容感基础09:电感器原理(1)-电感器
- 下一篇: XTU OJ 1397 Patchoul