本次也是天天快樂編程集訓隊2021CSP&NOIP賽前訓練-賽前適應賽的題目,OI賽制有步驟分,請大家放心書寫代碼。
2018年一等獎浙江分數線為230分,二等獎分數線為100分,三等獎分數線為80分。
當年附中情況,zxy是163分
對應luogu題目, T1 標題統計、T2 龍虎斗、T3 擺渡車、T4 對稱二叉樹 ,可以到luogu上查看更多題解。
T1 標題統計 字符串
需要讀取一行,即gets或者getline。
判斷數字和字母大小寫就是滿分了
第一題比較送分,一般情況下第一題最簡單,是簽到題。但是如果第一題比較難,應該先做后面的,比賽時間有限。
正式比賽需要注意這個題目概況,這個題需要我們在相應的文件夾內將文件名命名為title.cpp,並在代碼中添加上文件讀寫。
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("title.in","r",stdin);
freopen("title.out","w",stdout);
//你的代碼
return 0;
}
T2 龍虎斗 枚舉、預處理
枚舉,p1位置加s1個工兵,然后依次枚舉把s2個工兵放在所有的兵營里,每次算一遍雙方勢力之差,取最小就可以了
直接枚舉,可以得到80分
#include <bits/stdc++.h>
using namespace std;
int n,m, p1, s1, s2;
int a[1000005];
//計算雙方勢力之差
int cal(int x)
{
//sum1計算左邊,sum2計算右邊
int sum1 = 0, sum2 = 0;
//先假設位置x加上s2個工兵
a[x] += s2;
for (int i = 1; i <= n; i++)
{
//m號兵營跳過
if (i == m)
continue;
//分左右
else if (i < m)
sum1 += (m - i) * a[i];
else
sum2 += (i - m) * a[i];
}
//再減去s2個,因為是假設加上了s2個工兵
a[x] -= s2;
if (sum1 >= sum2)
return sum1 - sum2;
return sum2 - sum1;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
scanf("%d%d%d%d", &m, &p1, &s1, &s2);
//加上s1個工兵
a[p1] += s1;
int min = 1e9,ans;
//枚舉編號i
for (int i = 1; i <= n; i++)
{
//算一下勢力之差
int tmp = cal(i);
//小的話要更新
if (min > tmp)
{
min = tmp;
ans = i;
}
}
printf("%d", ans);
return 0;
}
之前的代碼是超時的,因為做法是O(n^2 )的,但是后20%數據是10^5 ,寫起來要難寫些。而且預處理會爆int,當求和是一定要計算好數據類型是否夠用,因為比賽沒有OJ幫忙驗證。
其實就是做下前綴和
T3 擺渡車 動態規划(高級)
這題比想像得要難,dp[i][j]表示第i個人等了j分鍾的最優值 ,
T4 對稱二叉樹 二叉樹
這題反而沒想象的那么難,直接dfs就好了