夏令营入门组day2

avatar
作者
筋斗云
阅读量:0

目录

一. 试卷

二. 专题:贪心,构造


一. 试卷

1. 资产

(1)错误思路:· 每一步都取绝对值

                           · 若下一个数为负且当前和为负时不取绝对值,若下一个数为正且当前和为负时取绝对值。反例:-5 -3 2 -1 -7 在加完前两个时遇到2不应取绝对值,应该在最后一步时再取加绝对值才能达到最大值。

(2)正确思路:由于并不知道该在何时对和取绝对值,所以用maxn和minn看最大能到多大和最小能到多小,在最后一次再取绝对值。

#include<bits/stdc++.h> #define LL long long using namespace std;  const int N = 3e5; LL n, ans, a[N];  int main() { 	LL p, q, minn = 0, maxn = 0; 	cin >> n; 	for (int i = 1; i <= n; i ++) 	{ 		cin >> a[i]; 		p = maxn + a[i]; 		q = minn + a[i]; 		maxn = max(p, q, abs(p), abs(q)); 		minn = min(p, q, abs(p), abs(q)); 	} 	cout << maxn; 	return 0; } 

2. 视频游戏

正确思路:对回合数二分答案,回合数大于正确答案Boss一定死,小于正确答案一定杀不死,符合单调性。

#include<bits/stdc++.h> using namespace std;  int h, n, ans, a[200005], c[200005], cd[200005];  int f(int x, int h) { 	x --;  	for (int i = 1; i <= n; i ++) 		h -= (x / c[i]) * a[i]; 	return h; }  int main() { 	int l, r, mid; 	cin >> h >> n; 	for (int i = 1; i <= n; i ++) 	{ 		cin >> a[i]; 		h -= a[i]; 	} 	for (int i = 1; i <= n; i ++) 		cin >> c[i]; 	l = 1, r = 5e10;                    // 边界一定要开得大 	while (l <= r) 	{ 		mid = l + (r - l) / 2; 		if (f(mid, h) <= 0) 		{ 			ans = mid; 			r = mid - 1; 		} 		else 			l = mid + 1; 	} 	cout << ans; 	return 0; }

二. 专题:贪心,构造

(1)USACO21OPEN Acowdemia III

思路:

(1)并不关心每棵草让哪两头牛成为朋友,只要一棵草周围有两头牛以上就可一多出一对朋友。

(2) 但这会出现特殊情况,例如 ‘ C G     和    ' G C

                                                        G C ’             C G '     两堆草会出现重复的朋友。

(3)因此要分类讨论:· 一堆草周围牛数大于2,答案直接加一

                                      · 一堆草周围牛数等于2,祥判断是否满足上述特例,若满足,只要上方的草加过一次,下方的草就不加。

代码:

#include<bits/stdc++.h> #define LL long long using namespace std;  int n, m, ans, dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}, num[1001][1001]; char w[1001][1001];  int main() { 	cin >> n >> m; 	for (int i = 1; i <= n; i ++) 		for (int j = 1; j <= m; j ++)  			cin >> w[i][j]; 	for (int i = 1; i <= n; i ++) 		for (int j = 1; j <= m; j ++) 			for (int k = 0; k < 4; k ++) 				num[i][j] += (w[i + dx[k]][j + dy[k]] == 'C'); 	for (int i = 1; i <= n; i ++) 		for (int j = 1; j <= m; j ++) 			if (w[i][j] == 'G') 			{ 				if (num[i][j] > 2) 					ans ++; 				if (num[i][j] == 2) 				{ 					if ( (w[i][j - 1] == 'C' && w[i - 1][j - 1] == 'G' && w[i - 1][j] == 'C'  						&& num[i - 1][j - 1] == 2)  					   || (w[i - 1][j] == 'C' && w[i][j + 1] == 'C' && w[i - 1][j + 1] == 'G'  					    && num[i - 1][j + 1] == 2) ) 						continue; 					ans ++;		 				}		 			}		 	cout << ans; 	return 0;	 }

(2)USACO05NOV  奶牛玩杂技 

思路:体重与力量值之和从大到小依次从下往上叠。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!