牛客周赛 Round 62

赛时AC: ABC               rating:                补题:ABCDEF


比赛链接:(0条未读通知) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)


A

按照题意输出即可

字符串

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
void solve()
{
	string s;
    cin>>s;
    cout<<s[1];
    cout<<s[0];
    for(int i=2;i<5;i++)
    {
        cout<<s[i];
    }
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int t=1;//cin>>t;
	while(t--)
	{
		solve();
	}
}

B

题目要求按照顺序移动,那就没有最值一说。

读懂意思是,向原点移动。

在右边就向左移动。

在左边就向右移动。

模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
void solve()
{
	ll n,x;
    cin>>n>>x;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        if(x==0)
        {
            break;
        }
        if(x>0)
        {
            x-=a[i];;
            ans+=a[i];
        }
        else if(x<0)
        {
            x+=a[i];
            ans+=a[i];
        }
    }
    cout<<ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int t=1;//cin>>t;
	while(t--)
	{
		solve();
	}
}

C

读懂意思不难。原点跳出圆的最短距离,就是与圆心的连线上的距离。

注意处理时的细节。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
ll x[N],y[N],r[N];
ll b[N];
vector<double>cal;
void solve()
{
	ll n,k;
    cin>>n>>k;
    cout<<fixed<<setprecision(17);
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i]>>r[i];
    }
    double ans=0;
    ll cnt=0;
    for(int i=1;i<=n;i++)
    {
        double t=0;
        t=x[i]*x[i]+y[i]*y[i];
        if(t<=r[i]*r[i])
        {
            cnt++;
            b[i]=1;
        }
    }
    if(cnt<=k)
    {
        cout<<0;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(!b[i])
        {
            continue;
        }
        double t=(r[i]*1.0-sqrt(x[i]*x[i]+y[i]*y[i]))*acos(-1.0)*r[i]*r[i];
        cal.push_back(t);
    }
    cnt-=k;
    sort(cal.begin(),cal.end());
    //cout<<cal[0];
    for(int i=0;i<cnt;i++)
    {
        ans+=cal[i];
    }
    cout<<ans;

}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int t=1;//cin>>t;
	while(t--)
	{
		solve();
	}
}

D--本次重点

从根一直到叶子节点,这算一种情况。

一种情况的期望是,从根到该叶子节点i的节点数dis[i],乘以路上每个节点选中的概率,是同层的节点数分支1。思路很简单。关键是怎么表达出来。

用vis[i],来表示到i层的概率,他的逆元就是选中的概率。

在叶子节点所有乘起来相加。

树上期望

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N],ans=0;
vector<ll>g[N];
ll vis[N],dis[N];
ll ksm(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
        ans=(ans*a)%mod;
        a=a*a%mod;
        b/=2;
    }
    return ans;
}
ll inv(ll a)
{
    return ksm(a,mod-2);
}
void dfs(ll p,ll fa)
{
    for(auto i:g[p])
    {
        if(i==fa)
        {
            continue;
        }
        dis[i]=dis[p]+1;
        ll len=g[p].size();
        if(p!=1)
        len--;
        vis[i]=inv(len)*vis[p];
        vis[i]%=mod;
        dfs(i,p);
    }
    if(g[p].size()==1&&p!=1)
    {
        (ans+=(dis[p]*vis[p])%mod)%=mod;
    }
}
void solve()
{
	ll n;
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        ll u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
     vis[1]=1;
    dis[1]=1;
    dfs(1,0);
   
    cout<<ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int t=1;//cin>>t;
	while(t--)
	{
		solve();
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值