B. Patchouli‘s Magical Talisman #796 div2
??????Problem - B - Codeforces
題意就是給你序列a,問最小操作可以使a里面的數(shù)都是奇數(shù)
操作1:選任意兩個(gè)數(shù)合并
操作2:選一個(gè)偶數(shù)/2
這個(gè)題的思路還是很明朗的,奇數(shù)就是0,奇數(shù)+偶數(shù)必為奇數(shù),序列a中如果存在奇數(shù)就是偶數(shù)的個(gè)數(shù),因?yàn)榕紨?shù)可以不斷加到奇數(shù)上面去。但是如果都是偶數(shù)怎么辦,這個(gè)地方就是貪心了,我一開始思路錯(cuò)了,想著全部加起來是個(gè)偶數(shù),然后每次除以2除到奇數(shù)為止。
這個(gè)就是貪心的策略了,我這么想得需要證明這個(gè)方法的合理性啊,不證明合理性就這么想當(dāng)然當(dāng)然會(huì)錯(cuò),比如32,要除以到奇數(shù)得5次,兩個(gè)奇數(shù)偶數(shù)相加得到32,得6次。那如果取兩個(gè)偶數(shù)先除以2,得到最小的操作次數(shù)到奇數(shù),然后把另外的偶數(shù)依次加上去,當(dāng)然這樣更優(yōu)
所以都是偶數(shù)的情況:每個(gè)數(shù)都除以2到奇數(shù)的最小操作次數(shù)求出來,先在序列里面找到一個(gè)奇數(shù),然后把偶數(shù)依次加上去: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; }總結(jié)
以上是生活随笔為你收集整理的B. Patchouli‘s Magical Talisman #796 div2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4 指南针制作方法
- 下一篇: 中科院量子计算机芯片,超导量子计算云平台