識海社群打卡-6

夏尾草發表於2024-11-16

這場掉回灰名了,本來必然上大分,原因無他-查寢

先來查波戰績:

image-20241116132743059

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本來絕對上大分狗日的!煞筆查寢!

image-20241116133120502

因為煞筆查寢,我在一怒之下怒了很多下,還讓我被網友查到號笑話了嗚嗚嗚,雖然也有我自己的問題但鍋還是得甩給煞筆查寢,一開始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中行暴力之法是不太可行的

image-20241116134559138

那我們重新思考一下如何對程式碼進行最佳化,程式碼是要模擬找後面中比遠點小的數,然後再往前找更大的數,再往後找更小的數,如此往復。那我們就能從前往後儲存最大的數,再從後往前查詢最小的數進行儲存。

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,是互動題也不會,

My vegetable was exploded!