B. Patchouli‘s Magical Talisman #796 div2
生活随笔
收集整理的這篇文章主要介紹了
B. Patchouli‘s Magical Talisman #796 div2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????Problem - B - Codeforces
題意就是給你序列a,問最小操作可以使a里面的數都是奇數
操作1:選任意兩個數合并
操作2:選一個偶數/2
這個題的思路還是很明朗的,奇數就是0,奇數+偶數必為奇數,序列a中如果存在奇數就是偶數的個數,因為偶數可以不斷加到奇數上面去。但是如果都是偶數怎么辦,這個地方就是貪心了,我一開始思路錯了,想著全部加起來是個偶數,然后每次除以2除到奇數為止。
這個就是貪心的策略了,我這么想得需要證明這個方法的合理性啊,不證明合理性就這么想當然當然會錯,比如32,要除以到奇數得5次,兩個奇數偶數相加得到32,得6次。那如果取兩個偶數先除以2,得到最小的操作次數到奇數,然后把另外的偶數依次加上去,當然這樣更優
所以都是偶數的情況:每個數都除以2到奇數的最小操作次數求出來,先在序列里面找到一個奇數,然后把偶數依次加上去:cnt+n-1
#include<iostream> #include<vector> using namespace std; typedef long long ll; const int N=2e5+10; ll a[N]; int main(){int T;cin>>T;while(T--){ll n,even=0,od=0,sum=0,res=0x3f3f3f3f;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]%2==1) od++;if(a[i]%2==0) even++;sum+=a[i];}if(od&&even){cout<<even<<"\n";continue;}else if(even==0&&od){cout<<"0\n";continue;}else if(od==0&&even){for(int i=1;i<=n;i++){ll cnt=0;while(a[i]%2==0){cnt++;a[i]/=2;}res=min(res,cnt);}cout<<res+n-1<<"\n";}}return 0; }總結
以上是生活随笔為你收集整理的B. Patchouli‘s Magical Talisman #796 div2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4 指南针制作方法
- 下一篇: 用python打开ccd相机_用pyth