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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 2453 贪心应用

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2453 贪心应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
      • 1.1 題目鏈接
      • 1.2 題目大意
      • 1.3 解題思路
    • 2. Accepted 代碼

1. 題目

1.1 題目鏈接

http://poj.org/problem?id=2453

1.2 題目大意

一個數x的二進制表示有n個1,求一個有相同個數1的二進制數(比x大,且要最小的)

1.3 解題思路

  • 求出該數的二進制表示
  • 從低位往高位找到第一個為1的位 i ,檢查其下一位 i+1
  • i+1 位值為 0,直接交換01,結束查找
  • i+1 位值為1,將 i 位的1不斷地與前面的交換,換至最低位
  • 重復以上過程

2. Accepted 代碼

/*** @description: 貪心應用poj2453* @author: michael ming* @date: 2019/7/2 20:46* @modified by:*/ #include <cstring> #include <iostream> using namespace std;int calc(int num, int *binarynum) {int i = 0, j, k, value = 0;while(num != 0){binarynum[i++] = num % 2;//數組存儲的是該數的二進制的反序序列num = num/2;}k = i;//k記錄最后一個有效位的下一位for(i = 0; i < k; ++i){if(binarynum[i] == 0)continue;//找到為1的iif(binarynum[i+1] == 0)//如果i的下一個為0{swap(binarynum[i],binarynum[i+1]);//交換完成尋找break;}for(j = i; j >= 1; --j)//否則將i處的1換到最開始{swap(binarynum[j],binarynum[j-1]);}}for(i = k; i >= 0; --i)//計算對應的10進制數值//最后一位k-1可能進位到k,所以i從k開始value = value*2 + binarynum[i];return value; } int main() {int binarynum[30];//數據大小不會超過30位2進制int num;while(cin >> num && num){memset(binarynum,0,30*sizeof(int));cout << calc(num,binarynum) << endl;}return 0; }

總結

以上是生活随笔為你收集整理的POJ 2453 贪心应用的全部內容,希望文章能夠幫你解決所遇到的問題。

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