求助一道站外题
  • 板块灌水区
  • 楼主luo_gu_wjy
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/2/19 20:12
  • 上次更新2023/10/28 08:08:18
查看原帖
求助一道站外题
680675
luo_gu_wjy楼主2022/2/19 20:12

#include<bits/stdc++.h>

using namespace std;

int  a[210], f[210][21][210], w[210][21],c[210]; 

int r(){
	int x = 1;
	a[0] = 1;
	while(a[x - 1] > 0){
		a[x] = getchar();
		a[x] -= '0';
		x++;
	}
	return (x - 2);
}

int wh(int x){
	if(x > 9){
		wh(x / 10);
	}
	putchar(x % 10 + '0');
}

void ch(int z){
	for(int i = 1; i <= z; i++){
		int x = 0;
		for(int j = 1; j <= i; j++){
			f[i][0][++x] = a[j];
		}
		w[i][0] = x;
	}
}

void t(int l, int i2, int j2){
	for(int i = 1; i <= l; i++){
		f[i2][j2][i] = c[i];
	}
	w[i2][j2] = l;
}
void co(int ln, int lp, int i1, int j1){
	int q;
	if(ln < lp){
		t(ln, i1, j1);
		return ;
	}
	if(ln > lp){
		return ;
	}
	for(int i = ln; i >= 1; i--){
		if(f[i1][j1][i] < c[q]){
			return ;
		}
		if(f[i1][j1][i] < c[q]){
			t(ln, i1, j1);
			return ;
		}
	}
}

void fi(int i0, int j0, int k0){
	int lon1, lon2, lon3, lon;
	memset(c, 0, sizeof(c));
	for(int i = 1; i <= w[k0][j0 - 1]; i++){
		c[i] = f[k0][j0 - 1][i];
	}
	lon1 = w[k0][j0 - 1];
	lon2 = i0 - (k0 + 1) + 1;
	if(lon2 > lon1){
		c[lon2 + 1] = 0;
		for(int i = lon1 + 1; i <= lon2; i++){
			c[i] = 0;
		}
		lon = lon2;
	}
	else if(lon1 > lon2){
		c[lon1 + 1] = 0;
		lon = lon1;
	}
	else{
		lon = lon1;
	}
	int ch = k0 + 1;
	for(int i = 1; i <= lon; i++){
		if(ch > i0 + 1){
			break;
		}
		c[i] += a[ch++];
	}
	for(int i = 1; i <= lon; i++){
		if(c[i] >= 10){
			c[i + 1] += c[i] / 10;
			c[i] = c[i] % 10;
			if(i == lon){
				lon++;
				break;
			}
		}
	}
	co(lon, w[i0][j0], i0, j0);
}

int main() {
	int n, e, z;
	z = r();
	cin >> n;
	for(int i = 1; i <= z / 2; i ++){
		swap(a[i], a[z - i + 1]);
	} 
	for(int i = 1; i <= 200; i++){
		for(int j = 1; j <= 20; j++){
			for(int k = 1; k <= 200; k++){
				f[i][j][k] = 10000; 
			}
		}
	}
	for(int i = 1; i <= 200; i++){
		for(int j = 1; j <= 20; j++){
			w[i][j] = 300;
		}
	}
	ch(z);
	for(int i = 2; i <= z; i++){
		for(int j = 1; j <= min(i - 1, n); j++){
			for(int k = j; k <= i - 1; k++){
				fi(i, j, k);
			}
		}
	}
	for(int i = w[z][n]; i >= 1; i--){
		wh(f[z][n][i]);
	}
	return 0;
}
2022/2/19 20:12
加载中...