牛客练习赛24

A

相邻两个种类不同,直接m*(m-1)*(m-1)。。。。n-1次即可。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int mod=1000000000+7;

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int i,j;
    bool f=0;
    ll ans=m;
    for(i=1;i<n;i++)
    {
        ans=(ans*(m-1))%mod;
    }
    printf("%lld\n",ans);
    return 0;
}

B

#include<bits/stdc++.h>
using namespace std;

int fa[1000100],num[1000100];

int Find(int x)
{
    return fa[x]==-1?x:fa[x]=Find(fa[x]);
}

void Bond(int x,int y)
{
    int fx=Find(x);
    int fy=Find(y);
    if(fx!=fy)
        fa[fx]=fy;
}

int main()
{
    int n,i,j;
    memset(fa,-1,sizeof(fa));
    scanf("%d",&n);
    for(i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(x!=1&&y!=1)
            Bond(x,y);
    }
    int ans=0;
    for(i=1;i<=n;i++)
        ++num[Find(i)];
    for(i=1;i<=n;i++)
        ans=max(ans,num[i]);
    printf("%d\n",ans);
    return 0;
}

C

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N=1000010;

int cntR[N],cntB[N];

int main()
{
    int n,m,i;
    string s;
    scanf("%d%d",&n,&m);
    cin>>s;
    int cnt1=0,cnt2=0;
    for(i=0;i<s.length();i++)
    {
        if(s[i]=='B')
            cntB[++cnt1]=(i+1);
        else
            cntR[++cnt2]=(i+1);
    }
    while(m--)
    {
        char ch;
        int x;
        cin>>ch>>x;
        if(ch=='B')
        {
            if(x>cnt1)
                printf("-1\n");
            else
                printf("%d\n",cntB[x]);
        }
        else
        {

            if(x>cnt2)
                printf("-1\n");
            else
                printf("%d\n",cntR[x]);
        }
    }
    return 0;
}

D

#include<bits/stdc++.h>
using namespace std;

int dis[50050];

int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<n;i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        dis[x]=dis[y]+w;
    }
    int ans=-1;
    for(i=1;i<=n;i++)
        ans=max(ans,dis[i]);
    printf("%d\n",ans);
    return 0;
}

E

#include<bits/stdc++.h>
using namespace std;

const int N=333;;

int ans[N],dis[N];
bool vis[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int i,j,t;
    for(i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        dis[x]=y;
    }
    queue<int>q;
    q.push(0);
    memset(ans,0x3f3f3f3f,sizeof(ans));
    ans[0]=0;
    while(!q.empty())
    {
        t=q.front();
        q.pop();
        if(t+1<=n&&!vis[t+1])
        {
            q.push(t+1);
            vis[t+1]=1;
            ans[t+1]=min(ans[t+1],ans[t]+1);
        }
        if(t-1>=0&&!vis[t-1])
        {
            q.push(t-1);
            vis[t-1]=1;
            ans[t-1]=min(ans[t-1],ans[t]+1);
        }
        if(dis[t]&&!vis[dis[t]])
        {
            q.push(dis[t]);
            vis[dis[t]]=1;
            ans[dis[t]]=min(ans[dis[t]],ans[t]+1);
        }
    }
    printf("%d\n",ans[n]);
    return 0;
}

F

#include<bits/stdc++.h>
using namespace std;

const int N=100100;
const int mod=19260817;

int f[N];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    f[0]=1;
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        for(int j=x;j<=m;j++)
        {
            f[j]+=f[j-x];
            if(f[j]>mod)
                f[j]-=mod;
        }
    }
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        ans=(ans+f[i])%mod;
    }
    printf("%d\n",ans);
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值