NOIP2018 普及组复赛参考解析

题目传送

P5015 [NOIP2018 普及组] 标题统计

解析:简单题,没说的

点击查看代码
#include<bits/stdc++.h>
using namespace std;

int main(){
    int ans=0;
    string s; getline(cin, s);
    for(int i=0; i<s.size(); i++){
        if(s[i]!=' ') ans++;
    }
    cout<<ans;
}

P5016 [NOIP2018 普及组] 龙虎斗

解析:注意读题,仔细分析,可以结合图像,画个图来分析

image

  • 希望双方势力尽可能平均,可以先求出二者差值,之后枚举对应区间的答案即可。
  • 上述复杂度 O(n),足以解决问题,但其实还可以优化
  • 公式求出答案,由于除法存在小数,可以取左边,之后向右移动一位,并判断是否更优。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10,INF=0x3f3f3f3f;
LL n,m,p1,p2,s1,s2,c[N];
LL sa,sb,sc;

void slove1(){
    LL val=INF,temp;
    if(sc<=0){
        for(int i=1; i<=m; i++){
            temp = (m-i)*s2;
            if(abs(temp+sc) < val){
                val=abs(temp+sc), p2=i;
            }
        }
    }else{ // sc > 0
        for(int i=m; i<=n; i++){
            temp = (i-m)*s2;
            if(abs(temp-sc) < val){
                val=abs(temp-sc), p2=i;
            }
        }
    }
}
void slove2(){
    if(sc<=0){ // (m-p2) * s2 = sc < 0
        p2 = m-ceil(1.0*abs(sc)/s2);
        if(p2==0) p2++;
        if(p2+1<=m && abs(sc+s2*(m-p2))>abs(sc+s2*(m-(p2+1)))){
            p2++;
        }
    }else{     // (p2-m) *s2 = sc > 0
        p2 = m+sc/s2;
        if(p2+1<=n && abs(sc-(p2-m)*s2)>abs(sc-(p2+1-m)*s2)){
            p2++;
        }
    }
}
int main(){
    cin>>n;
    for(int i=1; i<=n; i++) cin>>c[i];
    cin>>m>>p1>>s1>>s2; c[p1] += s1;
    for(int i=1; i<m; i++)  sa+=c[i]*(m-i);
    for(int i=m+1; i<=n; i++) sb+=c[i]*(i-m);
    sc=sa-sb;
    // slove1();
    slove2();
    cout<<p2;
    return 0;
}

P5017 [NOIP2018 普及组] 摆渡车

P5018 [NOIP2018 普及组] 对称二叉树

posted @ 2022-10-05 10:13  HelloHeBin  阅读(176)  评论(0)    收藏  举报