贪心+二分求调
查看原帖
贪心+二分求调
487383
imnoob楼主2024/10/15 20:55

WA on 1# 2#

#include <bits/stdc++.h>
#define Code using
#define by namespace
#define zzx std
Code by zzx;
int c, t;
int n, a[100010];
long long v[19], cnt[100010][10], ans;
long long imin[7] = {0, 1, 11, 111, 1111, 11111, 111111}, imax[7] = {0, 9, 99, 999, 9999, 99999, 999999};
string s;
long long binary(int s, int x)
{
	int l = s, r = n;
	while(l < r)
	{
		int mid = ((l + r) >> 1);
		if(cnt[mid][x] > cnt[l - 1][x])
		{
			r = mid;
		}
		else
		{
			l = mid + 1;
		}
	}
	if(cnt[r][x] == cnt[l - 1][x])
	{
		return -1;
	}
	return r;
}
int main()
{
	scanf("%d", &c);
	scanf("%d", &t);
	while(t--)
	{
		ans = 10000000000;
		cin >> s;
		n = s.length();
		for(int i = 1; i <= n; ++i)
		{
			a[i] = int(s[i - 1] - '0');
			for(int j = 1; j <= 9; ++j)
			{
				cnt[i][j] = cnt[i - 1][j];
			}
			++cnt[i][a[i]];
		}
		for(int i = 1; i <= 9; ++i)
		{
			scanf("%lld", &v[i]);
		}
		for(int len = 1; len <= min(6, n); ++len)
		{
			for(long long i = imin[len]; i <= imax[len]; ++i)
			{
				long long s = i, sum = i, w[10], ord[10], u = 0;
				memset(w, 0, sizeof(w));
				int p = 1, flag = 1;
				while(s > 0)
				{
					ord[++u] = s % 10;
					s /= 10;
					++w[ord[u]];
				}
				if(w[0])
				{
					continue;
				}
				for(long long j = u; j >= 1; --j)
				{
					int res = binary(p, ord[j]);
					if(res == -1)
					{
						flag = 0;
						break;
					}
					p = res + 1;
				}
				if(flag == 0)
				{
					continue;
				}
				for(int j = 1; j <= 9; ++j)
				{
					sum += v[j] * long(cnt[n][j] - w[j]);
				}
				ans = min(ans, sum);
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
} 	
2024/10/15 20:55
加载中...