2.12 Codeforces Round #852 (Div. 2)
A - Yet Another Promotion
题意
给出需要买的物品总个数n,第一天购买物品是a元,第二天购买是b元,且若在第一天购买物品会有优惠:每买m个物品,送一个物品,也就是说在第一天花m个物品的钱可以买m+1个物品
问最少花多少钱可以买至少n个物品
思路
第一步:判断是否使用优惠
若是使用优惠,则m * a <= (m + 1) * b
在第一天买m个要比在第二天买m + 1个物品要便宜
否则不使用优惠,直接在第二天买n个就行
第二步:使用优惠
剩余部分使用min(a,b) * (n - (n / (m + 1)))即可
void solve() {
	LL a, b, n, m;
	cin >> a >> b >> n >> m;
	LL t = n / (m + 1);
	if ((m + 1) * b < m * a) {
		cout << n * b <<  endl;
	}else {
		LL ans = t * m * a;
		n = n - ((m + 1) * t);
		if (a > b) ans += n * b;
		else ans += n * a;
		cout << ans << endl;
	}
}
B - Fedya and Array
题意
给出x, y,要求构造出一串相邻数字差的绝对值为1的环形序列,设定一个数字,其相邻两个数字都比他小,则称这个数字为最大数。若相邻两个数字都比他大,则称为最小数。x为序列中最大数的和,y为最小数的和
要求输出序列的元素最小个数和构造的序列本身
思路
我开始是由gcd得到启发的,如4 2这两个数,可以组成序列2 1 2 1,其gcd后的值为2,去掉gcd之后就是2, 1,正好相差1,可以直接使用,若是去掉gcd后相差不为1,如3 7,那就补全中间数字,3 4 5 6 7 6 5 4,这个序列循环gcd的值次即可。
然后看了jiangly的代码,发现就只需要输出x,y之间的数然后反向输出一遍即可。如4 8,就是4 5 6 7 8 7 6 5,和我算的最小数字相同
LL gcd(LL x, LL y) {
	return y ? gcd(y, x % y) : x;
}
void solve() {
	LL x, y;
	cin >> x >> y;
	LL t = gcd(abs(x), abs(y));
	x /= t;
	y /= t;
	if (abs(x - y) == 1) {
		cout << (abs(y - x) + 1) * t << endl;
		while (t --) {
			for (int i = y; i <= x; i ++) cout << i << ' ';
		}
		cout << endl;
		return;
	}
	
	cout << (abs(y - x)) * 2 * t << endl;
	
	while (t --) {
		for (int i = x; i >= y; i --) cout << i << ' ';
		for (int i = y + 1; i <= x - 1; i ++) cout << i << ' ';
	}
	
	cout << endl;	
}
C - Dora and Search
题意
给出一串排列,问是否存在一对儿l, r使a[l],a[r]都不为区间内的最小值和最大值
思路
这题想起来反而很简单。因为是个排列,所以排列内所有数我们都能掌握,使用双指针即可
l = 1, r = n,两边同时扫描,若碰到a[l]或a[r]为当前(因为在扫描过程中需要更新不在区间内的最大/最小数)最大/最小数则向后/前走即可。若都不为,说明找到了,否则输出-1
void solve() {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; i ++) cin >> a[i];
	int mx = n, mn = 1;
	int l = 1, r = n;
	while (l < r) {
		bool f = 0;
		if (a[l] == mx) {
			l ++;
			mx --;
			f = 1;
		}
		if (a[l] == mn) {
			l ++;
			mn ++;
			f = 1;
		}
		if (a[r] == mx) {
			r --;
			mx --;
			f = 1;
		}
		if (a[r] == mn) {
			r --;
			mn ++;
			f = 1;
		}
		if (!f) {
			cout << l << ' ' << r << endl;
			return ;
		}
	}
	cout << -1 << endl;
}
总结
感觉思维上还是不太活,第二题明明那么简单的构造却想不到,反而第三题这种可以一下想出来

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号