这场掉回灰名了,本来必然上大分,原因无他-查寝
先来查波战绩:
c题没过纯属是因为被查寝查了室友也是个不知变通的让查寝记我头上了,byd害我赶回去,本来这题必出
看看我最后一发提交错哪了
void solve()
{
int n;
cin >> n;
if (n % 2)
{
if (n < 27)
{
cout << -1 << nl;
return;
}
else{
cout << 1 << " " << 2 << " " << 2 << " " << 3 << " " << 3 << " ";
cout << 4 << " " << 4 << " " << 5 << " " << 5 << " ";
cout << 6 << " " << 6 << " " << 7 << " " << 7 << " ";
cout << 8 << " " << 8 << " " << 9 << " " << 1 << " ";
cout << 10 << " " << 10 << " " << 9 << " " << 11 << " ";
cout << 11 << " " << 12 << " " << 13 << " " << 13 << " ";
cout << 1 << " " << 12 << " " ;
int res = 14;
for(int i = 28;i < n;i+=2){
cout << res << " " << res << " ";
//这个地方其实应该加一个res++,因为忘记加了估计是写的时候太急了,煞笔室友催我回去销假,最近煞笔教育评估查的严煞笔大专还有煞笔宵禁,煞笔查寝就应该遗臭万年太煞笔了害我掉分,早不查晚不查上分的关键点上查。
}
}
}
else
{
int res = 0;
for (int i = 0; i < n; i += 2)
{
cout << res + 1 << " " << res + 1 << " ";
res++;
}
}
cout << nl;
}
查寝的结果就是:掉大分了!tnnd本来绝对上大分狗日的!煞笔查寝!
因为煞笔查寝,我在一怒之下怒了很多下,还让我被网友查到号笑话了呜呜呜,虽然也有我自己的问题但锅还是得甩给煞笔查寝,一开始c读错题目了,我构造成了1-16-25,wa了两发重新读题才发现,我确实煞笔了,还是训少了。
今天为了哀悼我掉的43分,我狠狠加训!
D. Penchick and Desert Rabbit
说实话如果前面写得快可能就有机会把这题a了铸造荣光了
题意大概是一个数组,往后跳只能跳到矮的地方,往前跳能跳到高的地方,如果用暴力写的话就是
void solve()
{
int n;
cin >> n;
vector<int > a(n);
for(int i = 0;i < n;i++){
cin >> a[i];
}
vector<int> b(n);
int mx1 = 0;
for(int i = 0;i < n;i++){
b[i] = a[i];
if(i)
mx1 = max(mx1,a[i - 1]);
b[i] = max(b[i],mx1);
int mx2 = 0;
for(int j = i + 1;j < n;j++)
{
if(a[j] < b[i]){
b[i] = max(b[i],mx2);
}
else if(a[j] > b[i]){
mx2 = max(mx2,a[j]);
}
}
}
for(int i = 0;i < n;i++){
cout << b[i] << " ";
}
cout << nl;
}
显然在cf中行暴力之法是不太可行的
那我们重新思考一下如何对代码进行优化,代码是要模拟找后面中比远点小的数,然后再往前找更大的数,再往后找更小的数,如此往复。那我们就能从前往后存储最大的数,再从后往前查找最小的数进行存储。
void solve()
{
int n;
cin >> n;
vector<int > a(n);
for(int i = 0;i < n;i++){
cin >> a[i];
}
vector<int> b(n);
vector<int> pre(n + 1,0);
for(int i = 0;i < n;i++){
pre[i + 1] = max(pre[i],a[i]);
}
vector<int> suf(n + 1,INT_MAX);
for(int i = n - 1;i >= 0;i--){
suf[i] = min(suf[i + 1],a[i]);
}
int r = -1;
for(int i = 0;i < n;i++){
if(pre[i + 1] <= suf[i + 1]){
for(int j = r + 1;j <= i;j++)
{
b[j] = pre[i + 1];
}
r = i;
}
}
for(int i = 0;i < n;i++){
cout << b[i] << " ";
}
cout << nl;
}
如果当前位置上的最大值比往后的最小值小,那么说明不能往后再跳了,应当等于当前位置上的最大值,并且设立suf[n]==INT_MAX使得循坏到最后不会过头,并且最后一格肯定等于数组的最大值。
看了下e,是树不会,看了f,是交互题也不会,