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 外挂使用拒绝

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

updL打表发现是组合数哇····然后向zhber学习了一下差分的组合数······

#include <bits/stdc++.h>
using namespace std;
#define modd    1000000007
typedef long long ll;
ll a[1010];
ll tot[1010],in[10001];
ll inv(ll x)
{
    ll ans = 1,b = modd-2;ll base = x;
    while(b){if(b%2 == 1)ans = ans*base%modd;base = base*base%modd; b = b/2;}return ans;
}
ll c(ll n,ll m)
{
    ll ans = 1;m = n-m;
    for(ll i = n-m+1;i<=n;i++)ans=(ans*i)%modd;
    for(ll i = 1;i<=m;i++)ans = ans*in[i]%modd;
    return ans;
}
void solve()
{
    int n,k;scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)tot[i]=c(i+k-2,k-1);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)a[i] = (a[i]-tot[i-j+1]*a[j])%modd;
    }
    for(int i=1;i<=n;i++)printf("%lld",(a[i]+modd)%modd),printf(i == n?"\n":" " );
}
int main(int argc, char const *argv[])
{
    for(int i=1;i<=1000;i++)in[i]=inv(i);
    int t;scanf("%d",&t);
    while(t--)solve();
    return 0;
}
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可以来拯救吗

爆搜剪枝···

路上听的bittian的写法orz

#include <bits/stdc++.h>
using namespace std;
#define modd    1000000007
typedef long long ll;
ll ans =0;
ll a[100010],su[100010];
int n,k;
void dfs(int tot,ll sum,int now)
{
    if(n -tot+1<k-now)return;
    if(n - tot+1 == k - now)
    {
        sum +=  su[n]-su[tot-1];
        ans ^= sum*sum;
        return;
    }
    if(now == k)
    {
        ans ^= sum*sum;
        return;
    }dfs(tot+1,sum+a[tot],now+1);
    dfs(tot+1,sum,now);

}
void solve()
{
    scanf("%d%d",&n,&k);ans = 0;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]),su[i]=su[i-1]+a[i];
    dfs(1,0,0);
    printf("%lld\n",ans );
}
int main(int argc, char const *argv[])
{
    int t;scanf("%d",&t);
    while(t--)solve();
    return 0;
}
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();
}

转载于:https://www.cnblogs.com/miamiao/p/8724358.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值