D: 可以借鉴一下打家劫舍,选了第i位,i+1位和i-1位都不能选,本质是选了第i位,i-1位不能选,此时考虑动态规划(动态规划经验之一):
using namespace std;
const int N=2e5+10;
int n;
int a[N],dp[N];
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
dp[1]=a[1];
dp[2]=max(dp[1],dp[0]+a[2]);
for(int i=3;i<=n;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+a[i]);
}
cout << dp[n] << endl;
return 0;
}
E:作为一道构造题的经验:由恰好有a个长为3且所有元素之和是1的倍数的子数组。去推断数组的长度为 a+2,同时此题也需要用到贪心的思想在2,3条件下,去找到min(2,3)条件的最小满足条件,随后去弥补较大条件的条件,最后在去比较与a+2的值。此题可以作为贪心和构造题的经验之一。
```void solve() {
int a, b, c;
cin >> a >> b >> c;
int n = a + 2;
int x = max(b + c - a, 0);
if (b > a || c > a || x > min(b, c)) {
cout << -1 << "\n";
return;
}
int y = a - x - (b - x) - (c - x);
if (a == 0) {
cout << "1 1" << "\n";
return;
}
vector<int> s;
for (int i = 0; i < x; ++i) s.pb(0);
for (int i = 0; i < b - x; ++i) s.pb(2);
for (int i = 0; i < c - x; ++i) s.pb(3);
for (int i = 0; i < y; ++i) s.pb(1);
vector<int> m(n + 1);
m[1] = m[2] = 0;
for (int i = 1; i <= a; ++i) {
int val = ((s[i - 1] - m[i] - m[i + 1]) % 6 + 6) % 6;
m[i + 2] = val;
}
for (int i = 1; i <= n; ++i) {
cout << m[i] + 6 << " ";
}
cout << "\n";
}
F:本题也是一道构造题,经验较为重要,b为10......1,a得看n的奇偶性,总的来说本题的经验性较强,可作为经验回收。
``` js
```#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if(n==1) {cout << -1 << endl;return 0;}
if(n&1) {
string a,b;
b+='1';
for(int i=2;i<=n-1;i++)
{
b+='0';
}
b+='1';
for(int i=1;i<=(n-1)/2;i++)
{
a+="13";
}
a+='1';
cout << a << " " << b <<endl;
}else{
string a,b;
b+='1';
for(int i=2;i<=n-1;i++)
{
b+='0';
}
b+='1';
for(int i=1;i<=n/2;i++)
{
a+="12";
}
cout << a << " " << b <<endl;
}
return 0;
}
本次的周赛对算法的考察很少。此次周赛以经验吸收为主。前三题难度不大,第四题由于第一次见并没有想到动态规划,而是选择了模拟,但无法AC,所以本题将会与打家劫舍放在一起进行复习。第五,第六题作为经验去吸收。


京公网安备 11010502036488号