六月13号补题日记多画多写多模拟

该说不说,我臭臭的反应速度的确好,第一个题目这么容易就能想出来,牛逼:

A题意:谁先无法选择谁就赢,n >= 2,alice先选,并且最少选择两个

如果是n == 2:肯定就是bob赢了

如果是n == 3:肯定bob赢了

如果是n == 4:肯定还是bob赢了

其他的情况都是alice赢了,Alice无论如何会留下一个1 1,这样的化就很能保证让bob输,自己赢了

B:如果一直是递增的情况,很显然,直接加到后面就行了,如果递增着突然不递增了,此时加入的这个数字,必须要比第一个数字小,并且要大于最后一个数字,但是这样的化会有一种情况不对劲,就是3 7 7 9 2,这个2虽然是小于第一个,但是并没有大于最后一个,仍然可以放到这里,所以说如果是递增那就一直向后面放,如果是这个数字递减了,不是第一个递减的必须大于最后一个,小于等于第一个,如果是第一个只需要满足小于等于第一个就行了

这个代码也是非常的美丽:

#include 
#include 

using namespace std;

int main() {
	int u;
	cin >> u;
	for (int i = 0; i < u; i++) {
		int n;
		cin >> n;
		vector a(n);
		vector A;
		bool st = false;
		int T = 0;
		for (int j = 0; j < n; j++) {
			cin >> a[j];
			if (A.size() == 0 || (!st && a[j] >= A.back())) {
				A.push_back(a[j]);
				if (!st) {
					T++;
				}
				cout << "1";
			} else if (a[j] <= A[0] && (T == A.size() || a[j] >= A.back())) {
				A.push_back(a[j]);
				st = true;
				cout << "1";
			} else {
				cout << "0";
			}
		}
		cout << endl;
	}
	return 0;
}

C:分析公式我们发现,要么在开头变大,要么在结尾减小,先考虑枚举,所以这个题目是可以枚举直接通过的:

但是这个题目我仅仅是过了九个有样例:

#include 
using namespace std;
string s;
const int pow10[] = {1, 10, 100, 1000, 10000};
int res(string s){
	int ans = 0, mx = -1;
	for(int i = s.size() - 1; i >= 0; i--){
		int c = s[i] - 'A';
		if (c < mx) ans -= pow10[c];
		else ans += pow10[c];
		mx = max(mx, c);
	}
	return ans;
}

int main(){
	int T;
	cin >> T;
	while(T --){
		int ans = 0;
		cin >> s;
		
		int l = s.size();
		for(int j = 0;j <= 4;j ++){
			int st = -1,ed = -1;
			//妈的 先不用循环写了
			//A的位置
			for(int i = 0;i < l;i ++){
				if(s[i] - 'A' == j){
					st = i;
					break;
				} 
			}
			for(int i = l - 1;i >= 0;i --){
				if(s[i] - 'A' == j){
					ed = i;
					break;
				}
			}
			char t1 = s[st],t2 = s[ed];
			if(st >= 0 && st < l ){
				s[st] = 'E';ans = max(ans,res(s));
				s[st] = t1;
			}
			if(ed >= 0 && ed < l){
				s[ed] = 'A';ans = max(ans,res(s));
				s[ed] = t2;
			}	
			
		}
		cout << ans << endl;
	}
	return 0;
}

你可能感兴趣的:(算法)