2018bnu校赛总结

Posted miamiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018bnu校赛总结相关的知识,希望对你有一定的参考价值。

····我好菜,完全没有准确率只写了签到,完全被吊打QAQ
大概就是自己懒惰的后果吧qwq

A 塞特斯玛斯塔

签到···我因为是多组样例wa了一发····

#include <bits/stdc++.h>
using namespace std;
char s[100010];
int main()
{
    int t,n;scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            if(s[0]==‘P‘)cnt++;
        }
        if(cnt==n)printf("MILLION Master\n");
        else printf("NAIVE Noob\n");
    }
}

B 外挂使用拒绝

很像是多校赛的那题····然后多校赛没补···这题就很没有什么思路···

C萌萌哒身高差

打表就可以看出来结论···我推了很长时间(???????)然后打了个表==很简单的结论人然后就A了。

#include <bits/stdc++.h>
using namespace std;
double a[100010];
int main()
{
    int t,n,k;scanf("%d",&t);
    a[1]=0;
    int tot = 3;
    for(int i=2;i<=100;i++)
    {
        a[i]=a[i-1]+tot;tot+=2;
    }
    while(t--){
        scanf("%d",&n);
        printf("%.9f\n",a[n]/3);
    }
}

D雷电爆裂之力

枚举每个中间的找两边的最近的就行··因为我sb,一个地方m写成了k wa了一个半小时==

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
ll a[2000010],b[2000010],c[2000010];
ll abss(ll x){return x>0?x:-x;}
void solve()
{
    int n,m,k;scanf("%lld%lld%lld",&n,&m,&k);   
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);
    for(int i=1;i<=m;i++)scanf("%lld",&b[i]);sort(b+1,b+1+m);
    for(int i=1;i<=k;i++)scanf("%lld",&c[i]);sort(c+1,c+1+k);
    int r1 = 1,r2 = 1,r3=1;
    a[0]= -2e12;c[0]=-2e12;
    c[k+1] = a[n+1]=2e12;
    ll ans = 2e12;
    for(int i=1;i<=m;i++)
    {
        while(r1<=n&&a[r1]<b[i])r1++;
        while(r2<=k&&c[r2]<b[i])r2++;
        ans = min(ans,min(abss(c[r2]-b[i]),abss(c[r2-1]-b[i]))+min(abss(a[r1]-b[i]),abss(a[r1-1]-b[i])));
    }
    printf("%lld\n",ans+3);
} 
main()
{
    int t;scanf("%lld",&t);
    while(t--)solve();
}

E可以来拯救吗

待补

F汤圆防漏理论

开个优先队列每次取当前点权最小的点删了然后每次更新ans。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<int,ll> > g[1000010];
ll d[1000010];
int vis[1000010];
void solve()
{
    int n,m;scanf("%d%d",&n,&m);
    int u,v;ll w;
    for(int i=1;i<=n;i++)g[i].clear(),d[i]=vis[i]=0;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%lld",&u,&v,&w);
        g[u].push_back({v,w});g[v].push_back({u,w});
        d[u]+=w;d[v]+=w;
    }
    priority_queue<pair<ll,int>> que;
    for(int i=1;i<=n;i++)que.push({-d[i],i});
    ll ans = 0;
    while(!que.empty())
    {
        pair<ll,int> now = que.top();que.pop();
        int u = now.second;if(vis[u])continue;
        vis[u]=1;ans = max(ans,d[u]);
        for(int i=0;i<g[u].size();i++)
        {
            int v = g[u][i].first;
            d[v]-=g[u][i].second;
            que.push({-d[v],v});
        }
    }
    printf("%lld\n",ans );

}
int main(int argc, char const *argv[])
{
    int t;scanf("%d",&t);
    while(t--)solve();
    return 0;
}

G命名规范问题

简单模拟

#include <bits/stdc++.h>
using namespace std;
char s[2000010];
int isbig(char x)
{
    if(x<=‘Z‘&&x>=‘A‘)return 1;
    return 0;
}
void solve()
{
    scanf("%s",s+1);int n = strlen(s+1);
    if(n <= 2||isbig(s[2])||isbig(s[n])){printf("%s\n",s+1);return ;}
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(isbig(s[i]))cnt++;
    }
    if(isbig(s[1])&&cnt == 1){
    printf("%s\n",s+1);return;}
    for(int i=1;i<n;i++)
    {
        if(isbig(s[i])&&isbig(s[i+1]))
        {
            printf("%s\n",s+1);return;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i == 1&&isbig(s[i]))printf("%c",s[i]-‘A‘+‘a‘);
        else if(isbig(s[i]))printf("_%c",s[i]-‘A‘+‘a‘);
        else printf("%c",s[i]);
    }
    puts(""); 
} 
int main()
{
    int t;scanf("%d",&t);
    while(t--)solve();
}

H吾好梦中做题

待补

I如何办好比赛

QAQ赛时读错题了,其实是个简单题·····

因为比赛的时候没a==···(我好菜

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1000010];
int sum[1000010];
void solve()
{
    int n,m;scanf("%d%d",&n,&m);
    scanf("%s",s+1);
    ll ans =0;
    for(int i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+(s[i]==‘D‘);
        ans += sum[i]*(s[i]==‘M‘);
    }
    if(1ll*m>1ll*sum[n]*(n-sum[n]))printf("-1\n");
    else
    {
        printf("%lld\n",(ll)abs(ans - m) );
    }
}
int main(int argc, char const *argv[])
{
    int t;scanf("%d",&t);
    while(t--)solve();
    return 0;
}

J小白兔小灰兔

待补

K好学期来临吧

赛时还有十分钟的时候看了一眼··觉得是个dp没时间写了····然后就凉了,然后赛后听了一下zhberDP_(:з」∠)_

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1001],b[101];
ll d[1001][101][101][2];
void solve()
{
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++)scanf("%lld",&b[i]);
    sort(b+1,b+1+m);
    for(int i=1;i<=n;i++)
    {
        d[i][0][m+1][1] = d[i-1][0][m+1][0]+a[i];d[i][0][m+1][0] = max(d[i-1][0][m+1][1],d[i-1][0][m+1][0]);
        for(int k=m;k>=1;k--){
            d[i][0][k][1]=max(d[i-1][0][k][0]+a[i],d[i][0][k+1][0]+b[k]);
            d[i][0][k][0]=max(max(d[i][0][k+1][1],  d[i][0][k+1][0]),max(d[i-1][0][k][1],d[i-1][0][k][0]));
        }
        for(int j = 1;j<=m;j++)
        {
            d[i][j][m+1][1]=d[i-1][j][m+1][0]+a[i];
            d[i][j][m+1][0]=max(max(d[i][j-1][m+1][1],  d[i][j-1][m+1][0]),max(d[i-1][j][m+1][0],d[i-1][j][m+1][1]));

        }
        for(int j=1;j<=m;j++)
        {
            for(int k = m;k>j;k--)
            {
                d[i][j][k][1] = max(d[i-1][j][k][0]+a[i],d[i][j][k+1][0]+b[k]);
                d[i][j][k][0] = max(max(d[i-1][j][k][0],d[i-1][j][k][1]),max(d[i][j-1][k][1],d[i][j-1][k][0]));
            }
        }
    }
    ll ans =0;
    for(int i=1;i<=m;i++)for(int j=m;j>i;j--)for(int k=0;k<=1;k++)ans = max(ans,d[n][i][j][k]);
    printf("%lld\n",ans );
} 
int main()
{
    int t;scanf("%d",&t);
    while(t--)solve();
}

以上是关于2018bnu校赛总结的主要内容,如果未能解决你的问题,请参考以下文章

BNU校赛总决赛J 小白兔小灰兔 相交计算几何模板

ACM之行◇第一站◇ 2018HDU多校赛总结

杭师大校赛总结

BNU52325-Increasing or Decreasing-数位DP-DFS

Logistic回归 逻辑回归 练习——以2018建模校赛为数据源

2018 FJUT ACM 校赛 j题 外传:魔王打工记