程序員進(jìn)階之算法練習(xí)(一百)

新年伊始斩跌,終到百篇,龍年大吉。

題目1

題目鏈接
題目大意:
給出一個整數(shù)称勋,問該整數(shù)能否切分為兩個數(shù)字a和b,滿足:
1漓糙、a和b都不包括前導(dǎo)零铣缠,是一個正常的數(shù)字;
2昆禽、a和b都大于0蝗蛙;
3、b > a醉鳖;

如果可以捡硅,則輸出數(shù)字a和b;如果不可以則輸出-1盗棵;

輸入:
第一行壮韭,整數(shù)?? 表示t個樣例 ?? (1≤??≤10000)
每個樣例一行,單個整數(shù) (數(shù)字長度為2~8)

輸出:
每個樣例一行纹因,如果可以喷屋,則輸出數(shù)字a和b;如果不可以則輸出-1瞭恰;

Examples
input
5
20002001
391125
200200
2001000
12

output
2000 2001
39 1125
-1
200 1000
1 2

題目解析:
按照題目的要求屯曹,a要盡可能小,b要盡可能大惊畏。
由于題目給出的數(shù)字本身就合法恶耽,那么將第一個數(shù)字開始分為a,往后找到第一個非零的數(shù)字就分給b颜启,這樣b一定是最大的偷俭。
從字符串上切分好a和b,接下來就是轉(zhuǎn)成數(shù)字缰盏。
這里為了便于計(jì)算涌萤,從字符串a(chǎn)右邊開始往左邊枚舉每一個位置上的數(shù)字,就可以得到數(shù)字a口猜。(數(shù)字b同理形葬,也可以字符串切割后,用sscanf取巧)

class Solution {
    static const int N = 201010;
public:
    void solve() {
        int t;
        cin >> t;
        while (t--) {
            string str;
            cin >> str;
            int k = 1, n = str.length();
            while (k < n) {
                if (str[k] != '0') break;
                ++k;
            }
            if (k >= n) {
                cout << -1 << endl;
                continue;;
            }
            int x = 0, y = 0;
            int tmp = k - 1, val = 1;
            while (tmp >= 0) {
                x += val * (str[tmp] - '0');
                --tmp;
                val *= 10;
            }
            tmp = n - 1, val = 1;
            while (tmp >= k) {
                y += val * (str[tmp] - '0');
                --tmp;
                val *= 10;
            }
            if (x < y) cout << x << " " << y << endl;
            else  cout << -1 << endl;
        }
    }
}
ac;

題目2

題目鏈接
題目大意:
給出一個01字符組成的字符串??暮的,現(xiàn)在可以對字符串進(jìn)行任意次下面操作:
1笙以、刪除字符串中的某個一個字符,代價為1冻辩;
2猖腕、調(diào)換兩個位置上的字符拆祈,代價為0;

現(xiàn)在要求倘感,若干次操作后的字符串t放坏,t上面每一個字符都與原來字符串s的字符相反,比如說:
s=011
那么t=10老玛,最小操作代價是1淤年,移除一個字符1,然后交換一次0蜡豹、1的位置麸粮;

s=111100
那么t=00,最小操作代價是4镜廉,移除所有字符1弄诲;

問生成滿足要求的字符串t,最小的代價是多少娇唯。(注意移除所有字符也滿足要求)

輸入:
第一行齐遵,整數(shù)?? 表示t個樣例 ?? (1≤??≤10000)
每個樣例一行,字符串?? (1≤ |??| ≤2?1e5)

輸出:
每個樣例一行塔插,輸出滿足題目要求的最小代價梗摇;

Examples
input
4
0
011
0101110001
111100

output
1
1
0
4

題目解析:
按照題目的要求,直接看最終字符串t的樣式想许,比如說s=111100伶授,那么t=001111;
那么只需要累計(jì)原來0伸刃、1的數(shù)字?jǐn)?shù)量,然后從左到右枚舉t的位置逢倍,直到剩下的字符無法填充捧颅,那么就得到t的最大長度;
得到t的最大長度k较雕,那么需要移除的字符串長度就是n--k碉哑。

class Solution {
    static const int N = 201010;
public:
    void solve() {
        int t;
        cin >> t;
        while (t--) {
            string str;
            cin >> str;
            int n = str.length(), x = 0, y = 0;
            for (int i = 0; i < n; ++i)
                if (str[i] == '0') ++x;
                else ++y;
            int k = 0, cntX = x, cntY = y;
            while (k < n) {
                if (str[k] == '0') {
                    if (y > 0) --y;
                    else break;
                }
                else {
                    if (x > 0) --x;
                    else break;
                }
                ++k;
            }
            if (x + y == 0) {
                cout << 0 << endl;
            }
            else {
                cout << n - k << endl;
            }
        }
    }
}
ac;

題目3

題目鏈接
題目大意:
給出一個空的數(shù)組,現(xiàn)在有兩個操作:
操作1亮蒋,往數(shù)組添加一個數(shù)字2^x扣典;
操作2,詢問數(shù)組中的若干個數(shù)字慎玖,數(shù)字和是否可以為w贮尖;

輸入:
第一行,整數(shù)?? 表示m個操作 (1≤m≤100000)
每個操作一行
操作1趁怔,是輸入1和x (0≤x≤29 ).
操作2湿硝,是輸入2和w薪前;(0≤w≤1e9 ).

輸出:
每個操作2輸出一行,存在則輸出YES关斜,不存在輸出NO示括;

Examples
input
5
1 0
1 0
1 0
2 3
2 4

output
YES
NO

題目解析:
題目的數(shù)據(jù)范圍簡化了題目,首先x比較小痢畜,數(shù)組中最多只有30個整數(shù)類型垛膝,那么可以按照這個規(guī)則聚類;
其次丁稀,在判斷數(shù)組是否存在某個元素和時吼拥,可以從大到小遍歷數(shù)組,對于某個元素y如果小于等于當(dāng)前w二驰,則優(yōu)先取用扔罪,并且w=w-y,直到數(shù)組末尾桶雀;如果此時w=0矿酵,則有解,否則無解矗积;

class Solution {
   static const int M = 536870912; // 2^29
   int a[30];
public:
   void solve() {
       int t;
       cin >> t;
       while (t--) {
           int k, x;
           cin >> k >> x;
           if (k == 1) a[x]++;
           else {
               int cur = M;
               for (int i = 29; i >= 0; --i) {
                   if (a[i] > 0 && x >= cur) {
                       int left = 1, right = a[i] + 1;
                       int find = left;
                       while (left < right) {
                           int mid = (left + right) / 2;
                           lld sum = 1LL * mid * cur;
                           if (sum > x) {
                               right = mid;
                           }
                           else {
                               find = mid;
                               left = mid + 1;
                           }
                       }
                       x -= find * cur;
                   }
                   cur /= 2;
               }
               cout << (x == 0 ? "YES" : "NO") << endl;
           }
           
       }
   }
}
ac;

題目4

題目鏈接
題目大意:
有兩個整數(shù)n和k全肮,n表示字符串長度,k表示字符串由前k個小寫字符棘捣;
現(xiàn)在需要構(gòu)造一個字符串s辜腺,要求任何長度為n的字符串腺逛,都是字符串s的子序列色建;

輸入:
第一行茴她,整數(shù)?? 表示t個樣例 ?? (1≤??≤676)
每個樣例一行靴迫,整數(shù)n和k (1≤??≤26 ) and (1≤??≤26 ).

輸出:
每個樣例一行玉罐,輸出字符串s定拟,如果有多個則輸出最短長度的字符串鼻弧;

Examples
input
4
1 2
2 1
2 2
2 3

output
ab
aa
baab
abcbac

題目解析:
題目的要求习霹,所有常讀為n的字符串呜投,在拼接的時候就可以看成是n個選擇加匈,每次從k個字符中選擇一個;
那么在構(gòu)造的時候仑荐,可以采用這樣的策略:
我們重復(fù)abc/abc/abc這樣的字符串雕拼,每一組都相當(dāng)有k個不同字符的桶。
這樣構(gòu)造出來的結(jié)果就能滿足要求粘招。

class Solution {
    static const int N = 201010;
public:
    void solve() {
        int t;
        cin >> t;
        while (t--) {
            int n, k;
            cin >> n >> k;
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < k; ++j) putchar('a' + j);
            }
            cout << endl;
        }
    }
}
ac;

題目5

題目鏈接
題目大意:
有一個正整數(shù)x啥寇,現(xiàn)在需要把x分成n個正整數(shù),這些正整數(shù)之和是x;
現(xiàn)在要求示姿,n個正整數(shù)的最大公約數(shù)甜橱,盡可能的大;

輸入:
第一行栈戳,整數(shù)?? 表示t個樣例 ?? (1≤??≤1000)
每個樣例一行岂傲,整數(shù)??和 ?? (1≤??≤1e8) and (1≤??≤??).

輸出:
每個樣例一行,輸出最大的公約數(shù)子檀。

Examples
input
3
10 3
5 5
420 69

output
2
1
6

題目解析:
按照題目的要求镊掖,全部拆分成數(shù)字1,必然可以拆出滿足要求:
k-1個整數(shù)1褂痰,剩下的整數(shù)是x-n-1亩进,這些整數(shù)的最大公約數(shù)是1;

同理缩歪,假如最大公約數(shù)是2归薛,可以這么拆:
k-1個整數(shù)2,剩下的整數(shù)是x-2n-2匪蝙,最大的公約數(shù)是2主籍;

也就是說,假設(shè)最大公約數(shù)是k逛球,也可以這么安排:n-1個整數(shù)k千元,剩下是x-kn-k;

由于題目的范圍不大颤绕,那么枚舉最大公約數(shù)的數(shù)字就好幸海。

class Solution {
  static const int N = 201010;
public:
  void solve() {
      int t;
      cin >> t;
      while (t--) {
          int x, n;
          cin >> x >> n;
          int k = sqrt(x) + 1;
          int ans = 1;
          for (int i = 1; i <= k; ++i) {
              if (x % i == 0) {
                  if (i >= n) ans = max(ans, x / i);
                  if (x / i >= n) ans = max(ans, i);
              }
          }
          cout << ans << endl;
      }
  }
}
ac;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奥务,隨后出現(xiàn)的幾起案子物独,更是在濱河造成了極大的恐慌,老刑警劉巖氯葬,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挡篓,死亡現(xiàn)場離奇詭異,居然都是意外死亡溢谤,警方通過查閱死者的電腦和手機(jī)瞻凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門憨攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世杀,“玉大人,你說我怎么就攤上這事肝集≌鞍樱” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長所刀。 經(jīng)常有香客問我衙荐,道長,這世上最難降的妖魔是什么浮创? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任忧吟,我火速辦了婚禮,結(jié)果婚禮上斩披,老公的妹妹穿的比我還像新娘溜族。我一直安慰自己,他們只是感情好垦沉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布煌抒。 她就那樣靜靜地躺著,像睡著了一般厕倍。 火紅的嫁衣襯著肌膚如雪寡壮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天讹弯,我揣著相機(jī)與錄音况既,去河邊找鬼。 笑死闸婴,一個胖子當(dāng)著我的面吹牛坏挠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪乍,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼降狠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庇楞?” 一聲冷哼從身側(cè)響起榜配,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吕晌,沒想到半個月后蛋褥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睛驳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年烙心,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乏沸。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡淫茵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬跃,到底是詐尸還是另有隱情匙瘪,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站丹喻,受9級特大地震影響薄货,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碍论,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一谅猾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳍悠,春花似錦赊瞬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遥倦,卻和暖如春谤绳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袒哥。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工缩筛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堡称。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓瞎抛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親却紧。 傳聞我的和親對象是個殘疾皇子桐臊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容