SCOI2013 火柴棍數字 揹包

2022-05-20 19:55:25 字數 1180 閱讀 7654

由於越高位越好,我們先得出能組成的最高位

\(f[i][j][k]\)表示從低到高位第\(i\)位,手裡拿著\(j\)根火柴,第\(i\)位是否為\(0\)所需要的最少火柴

我們轉移僅需得出移動,與多餘或需添的對映關係;然後列舉變化關係去轉移

得出最高位後,直接貪心看目前所在最高位是否能添某個數字(最大)

#include#include#includeusing namespace std;

const int n=3510;

int n,m,all,use,len,i,j,k,x;char a[n];

short f[n/2][n*2][2];

int s[10]=,dx[11][10],dy[11][10];

inline void up(short&x,short y)

int main()

for(i=0;i<10;i++)

for(k=0;k<7;k++)

if(s[i]>>k&1)

dx[10][i]++,dy[10][i]++;

scanf("%s%d",a+1,&m);

n=strlen(a+1);

reverse(a+1,a+n+1);//最低位排前面

for(i=1;i<=n;i++)

a[i]-='0';

for(i=1;i<=n;i++)

all+=dy[10][a[i]];//總火柴

len=all/2;

for(i=n+1;i<=len;i++)

a[i]=10;

for(i=0;i<=len;i++)

for(j=-m;j<=m;j++)

for(k=0;k<2;k++)

f[i][j+n][k]=m+1;

f[0][n][0]=0;//n:0

for(i=0;im)len--;//最長長度

for(i=0;i<=len;i++)

for(j=-m;j<=m;j++)

up(f[i][j+n][0],f[i][j+n][1]);

for(all=0,i=len;i;i--)

for(j=9;~j;j--)

all-=dx[a[i]][j],use-=dy[a[i]][j];

}return 0;

}

題解 毒瘤 OI 刷題彙總 SCOI2013

由於不清楚題目順序,就按照 text 上面的排列好了。傳送門 電單車交易 text text 給出乙個 n n leqslant 10 5 個點 m m leqslant 2 10 5 條邊的無向連通圖,圖中的點 邊帶有邊權,其中有 q 0 leqslant q leqslant n 為特殊點,對於...

NOIP2013 火柴排隊

題目 分析 a中第幾大一定對應b中第幾大。ab同時移動相當於a移動,相對位置不變。所以,用c i 表示a i 需要移動到的 位置,求其中的逆序對。因為乙個每移動相鄰兩個元素相當於消除乙個逆序對。include include using namespace std const int tmax 10...

NOIP 2013 火柴排隊

題目描述 description 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 其中 ai表示第一列火柴中第 i 個火柴的高度,bi表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可...