Codeforces Round #657 (Div. 2)

A. Acacius and String

题意:

给你一个串,你可以把 换成任意字符,使得这个串最后只出现一次 a b a c a b a abacaba

暴力枚举 a b a c a b a abacaba 出现的位置。然后判断是否只出现一次。

AC代码:

string s;
int n;
string T = "abacaba";
bool check(string &a)
{
	int cnt = 0;
	rep(i, 0, n - 7)
	{
		if (a.substr(i, 7) == T)
			cnt++;
	}
	return cnt == 1;
}
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		cin >> n >> s;
		int flag = 0;
		rep(i, 0, n - 7)
		{
			string ss = s;
			bool ok = 1;
			rep(j, 0, 6)
			{
				if (ss[i + j] != T[j] && ss[i + j] != '?')
				{
					ok = 0;
					break;
				}
				ss[i + j] = T[j];
			}
			if (ok && check(ss))
			{
				rep(j, 0, n - 1)
				{
					if (ss[j] == '?')
						ss[j] = 'z';
				}
				puts("Yes");
				flag = 1;
				cout << ss << endl;
				break;
			}
		}
		if (!flag)
			puts("No");
	}
	return 0;
}

B. Dubious Cyrpto

题意;

有三个整数 a , b , c a,b,c 。满足 l < = a , b , c < = r l<=a,b,c<=r 还有一个整数 m = n a + b c m=n*a+b-c n n 是严格大于 0 0 的正整数。题面给定 l , r , m l,r,m 。要求出 a , b , c a,b,c 的值。

枚举 a a b + c b+c 就是余数,让他们俩之间一个为下界判断输出合适的即可。

AC代码:

ll l, r, m;
 
int main()
{
	int T;
	sd(T);
	while (T--)
	{
		slddd(l, r, m);
		for (ll a = l; a <= r; ++a)
		{
			ll t = m / a;
			ll p = m % a;
			if (t > 0 && p <= r - l)
			{
				plddd(a, l + p, l);
				break;
			}
			t++;
			p = t * a - m;
			if (t > 0 && p <= r - l)
			{
				plddd(a, l, l + p);
				break;
			}
		}
	}
	return 0;
}

C. Choosing flowers

题意:

m m 种花,每种花有第一次购买获得的数值与第 k k 次购买获得的数值 ( k > 1 ) (k>1) ,问你买 n n 朵花获得的最大数值是多少。

按照 a a 从大到小排序,如果当前 b b 比最大的 a a 还要打那就全选这个。否则就找到一个比当前 b b 大最接近他的 a a 。所有的 a a 都比这个 b b 大,那就全都买 a a .否则就买前面全部的一朵,然后剩下的都买当前的。

AC代码:

const int N = 1e6 + 50;
struct node
{
	ll a, b;
} v[N];

bool cmp(node a, node b)
{
	return a.a > b.a;
}

ll sum[N];
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		int n, m;
		sdd(n,m);
		rep(i, 1, m) 
		sdd(v[i].a,v[i].b);
		sort(v + 1, v + 1 + m, cmp);
		sum[0] = 0;
		rep(i, 1, m) 
		sum[i] = sum[i - 1] + v[i].a;
		ll res = 0;
		rep(i, 1, m)
		{
			if (v[i].b >= v[1].a)
				res = max(res, v[i].a + (n - 1) * v[i].b);
			else
			{
				int l = 1, r = m, mid, ans;
				while (l <= r)
				{
					mid = (l + r) >> 1;
					if (v[mid].a > v[i].b)
						l = mid + 1, ans = mid;
					else
						r = mid - 1;
				}
				if (ans >= n)
					res = max(res, sum[n]);
				else
				{
					ll tmp = sum[ans], nd = n - ans;
					if (i > ans)
						tmp += v[i].a, nd--;
					tmp += v[i].b * nd;
					res = max(res, tmp);
				}
			}
		}
		pld(res);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/107458960