情况
时间:2024年7月25日15:05
这场做的不太正经没认真(2小时a题···)
题解
A
题意
给出一个数组,你可以拆成左右两部分然后交换顺序,问你能否让他单调递增?
思路
环形检测这个数组的递增性,最多一处不递增。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| void solve() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } int cnt = 0; for (int i = 1; i < n; i++) { if (a[i] < a[i - 1]) { if (cnt == 0) cnt = i; else { cout << "No" << endl; return; } } } if (cnt == 0) { cout << "Yes" << endl; return; } else { for (int j = cnt + 1; j < n; j++) { if (a[j] < a[j - 1]) { cout << "No" << endl; return; } } if (a[0] < a[n - 1]) { cout << "No" << endl; return; } for (int i = 1; i < cnt; i++) {
if (a[i] < a[i - 1]) { cout << "No" << endl; return; } } cout << "Yes" << endl; } }
|
问题
刚写想的是划分区间,让后面的区间不在之前的区间内,后来发现想错了只能拆成左右两部分。
B
题意
一个数组是完美的:存在两个下标,每个数组中的数都能被至少其中一个下标的数组值整除
思路
最小的一定是其中一个索引。除完一遍标记能整除的,之后再拿最小的没标记的除,必须得能整除不然死。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| void solve() { int n;cin >> n; vector<int> a(n),vis(n,0); for (int i = 0; i < n;i++){ cin >> a[i]; } sort(a.begin(), a.end()); int thefirst = 0; for (int i = 1;i<n;i++){ if(a[i]%a[0]==0) { vis[i] = 1; } else if (thefirst == 0){ thefirst = i; } } for (int i = 1;i<n;i++){ if(vis[i] == 0){ if(a[i]%a[thefirst]!=0){ cout << "No" << endl; return ; } } } cout << "Yes" << endl; }
|
C
题意
要给一个数组全变成相同数:
你能将L,R之间的数,变成排序后的中位数的值。
思路
n=2 输出小的数
n>=3 输出长度为3的子数组的最大中位数。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| void solve() { int n; cin >> n; int ans = 0; vector<int> a(n); for(int i = 0;i < n;i++) cin >> a[i]; if (n == 2){ ans = min(a[0], a[1]); cout << ans << endl; } else { int temp[3]; for (int i = 0;i < n-2;i++){ temp[0] = a[i]; temp[1] = a[i + 1]; temp[2] = a[i + 2]; sort (temp, temp + 3); ans = max(ans, temp[1]); } cout << ans << endl; }
}
|