由於越高位越好,我們先得出能組成的最高位
\(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 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可...