NOIP2018 普及組復賽題解


本次也是天天快樂編程集訓隊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就好了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM