刪數遊戲 高精度

2021-08-11 18:50:49 字數 2207 閱讀 9346

思想分析

法2 棧法 推薦

時間限制: 1 sec

記憶體限制: 128 mb

給出乙個n位數字串,刪除任意k位,使剩下的數最大。

第1行:2個整數n和k(1<=k<=n<=500000)

第2行:n個數字(可能為0)

第1行:1個可行到的最大的數

10 4

4177252841

沒有看過非高精度刪數遊戲的童鞋,戳我檢視((^o^)/~)

這道題所用到的演算法是貪心,其思想是刪除上公升序列的第一位。

都分析到這裡了,感覺就完了是不是?

然後我就去做了……

因為字串操作不正確,然後就t了(我還用了erase函式……)。

**如下–>

#include

#include

#include

using

namespace

std;

int n,k,min=10;

string a;

int main()

}cout

0;}

然後我又想了很久………………

於是:這個方法呢是操作起來比較麻煩,但是很容易想到。

我們可以用兩個陣列,next[i]&last[i],把所有的數連在一起,構造乙個雙向鍊錶。

我們讓開頭和結尾等於-1。

如下是初始化結果–>鍊錶1

234……

nnext23

45……-1

last-11

23……n-1

用**表示也就是

for(i=0;i

1;i++)

next[i]=i+1;

next[n-1]=-1;

for(i=n-1;i>0;i--)

last[i]=i-1;

last[0]=-1;

則如果想刪除乙個數,那麼我們就讓這個數的前乙個數和這個數的後乙個數連線即可。

即:

next[last[t]]=next[t];

last[next[t]]=last[t];

例如1 2 3

現在要刪除212

3next23

-1last-11

2 也就是:

next[last[2]]–>next[1]=next[2]=3;

next[1]=3;

last[next[2]]–>last[3]=last[2]=1;

last[3]=1;

所以更新後就是13

next3-1

last-11

然後我們再用begin記錄下第乙個字元,已完成最後輸出

警告:如果所有數都刪完了還沒有達到k值,那麼我們還需要刪除末尾。

#include

#include

#include

using namespace std;

int n,k,min=10;

intlast[500001],next[500001],t,begin;

string a;

int main()

else

}else t=next[t];

}t=begin;j=0;

while(jnext[t];

j++;

}return

0;}

棧就是先進後出的乙個資料結構。

我們可以先讓第乙個進棧,然後判斷一下第二個準備進站的數滿不滿足進棧條件。

我們用a[i]來儲存資料,b[i]來模擬棧,top表示棧頂。

進棧條件即:

top>0&&a

[i]>b

[top]&&ci然後如果所有數都刪完了還沒有達到k值,那麼我們還需要刪除末尾。

是不是很簡單?

#include

#include

#include

using

namespace

std;

const

int mn=500005;

int n,k;

char b[mn];

string a;

int main()

高精度回文數

輸入輸出樣例 樣例2題目分析 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數 56,將 56加 65 即把 56 從右向左讀 得到 121是乙個回文數。又如 對於十進位制數 87 step1 87 78 165 step2 165 561 726...

高精度除法(高精度除以高精度)

先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...

動態規劃 取數遊戲 高精度區間DP

問題描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n m 的矩陣,矩陣中的每個元素aij均 為非負整數。遊戲規則如下 1.每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元素 2.每次取走的各個元素只能是該元素所在行的行首或行尾 3.每次取數都有乙個得分值,為每行取數的得分之和,...