日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?C. Amr and Chemistry

Problem's Link: http://codeforces.com/problemset/problem/558/C


?

Mean:?

給出n個數,讓你通過下面兩種操作,把它們轉換為同一個數。求最少的操作數。

1.ai = ai*2

2.ai = ai/2 (向下取整)

analyse:

基本思路:首先枚舉出每個數能夠到達的數字并且記錄下到達該數組需要的步數,然后從到達次數為n次的數字中選擇步數最小的即為答案。

對于一個數字Ai,它可以變換得到的數字可以分為三類:

1.向左移動n位得到的數字;

2.向右移動n位得到的數字;

3.奇數/2后得到的偶數向右移動n位得到的數字。

?

處理一個數 Ai:


1、對 Ai 執行左移操作,記錄 Ai 通過左移能夠得到的數字,上限為1e5,vis 數組加1,cnt數組記錄步數


2、對 Ai 執行右移操作,直到 Ai 為0.


若 Ai 的最低位為1,右移一步之后,進行左移,上限為1e5,維持vis數組和cnt數組.


若 Ai 的最低位為0,右移一步,維持vis數組和cnt數組.


這樣我們就把一個數的所有情況都處理出來了,并且是最少的操作數.


最后遍歷數組找 vis[i] 為n,并且操作數最小。

?

Time complexity: O(n*m*log(MAX))

?

Source code:?

?

/* * this code is made by crazyacking * Verdict: Accepted * Submission Date: 2015-07-15-18.53 * Time: 0MS * Memory: 137KB */ #include <queue> #include <cstdio> #include <set> #include <string> #include <stack> #include <cmath> #include <climits> #include <map> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #define LL long long #define ULL unsigned long long using namespace std;const int MAXN(10+int(1e5)); int arrive_step[MAXN<<1]; int arrive_num[MAXN<<1]; int a[MAXN],n;void init() {for(int i=0; i<MAXN<<1; ++i) { arrive_step[i]=0,arrive_num[i]=0; } }inline void count_arrive(int &x) {int t=x,step=0;arrive_num[t]++;while(t<=int(1e5)){t<<=1;step++;arrive_step[t]+=step;arrive_num[t]++;}t=x,step=0;while(t>1){if(t!=1 && (t&1)){int sta=t>>1;int sstep=step+1;while(sta<=int(1e5)){sta<<=1;sstep++;arrive_step[sta]+=sstep;arrive_num[sta]++;}}t>>=1;step++;arrive_step[t]+=step;arrive_num[t]++;} }int main() {ios_base::sync_with_stdio(false);cin.tie(0);while(~scanf("%d",&n)){init();for(int i=0; i<n; ++i){scanf("%d",&a[i]);count_arrive(a[i]);}int ans=INT_MAX;for(int i=1; i<(MAXN<<1); ++i){if(arrive_num[i]==n)ans=ans<arrive_step[i]?ans:arrive_step[i];}printf("%d\n",ans);}return 0; } /**/

?

總結

以上是生活随笔為你收集整理的暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。