码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 300-A/B/C

时间:2015-04-02 18:59:12      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:codeforces

A题就是水题,直接按要求分类就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int n,cnt1,cnt2,cnt3,a[110];
    int b1[110],b2[110],b3[110];
    while(scanf("%d",&n)!=EOF)
    {
        cnt1=cnt2=cnt3=0;
        for(int i=0;i<n;i++)
        {
            int x;
            scanf("%d",&x);
            if(x<0&&cnt1==0)
            {
                b1[cnt1++]=x;
            }
            else if(x<0&&cnt1==1)
            {
                b3[cnt3++]=x;
            }
            if(x>0)
            {
                b2[cnt2++]=x;
            }
         }
            printf("1 %d\n",b1[0]);
            if(cnt2==0)
            {
                b2[cnt2++]=b3[--cnt3];
                b2[cnt2++]=b3[--cnt3];
            }
            printf("%d ",cnt2);
            for(int i=0;i<cnt2;i++)
                printf("%d ",b2[i]);
            printf("\n%d 0 ",cnt3+1);
            for(int i=0;i<cnt3;i++)
                printf("%d ",b3[i]);
            printf("\n");
    }
  return 0;
}

B题的话我们先把必须在一个队的人标记成同一个数,然后对那些没有组队要求的人,我们也随意给他们分成几组(标记);然后我们检查一下,如果有哪个队的人数大于三或则是小于3就是不可能的情况,输出-1;其它情况按标记输出组队情况。代码写的有点乱

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int M[50][50],vis[50];
int m,n;

int dfs(int x,int cnt)
{
    vis[x]=cnt;
    for(int i=1;i<=n;i++)
        if(M[x][i])
        {
            M[x][i]=M[i][x]=0;
            dfs(i,cnt);
        }
}

int main()
{

    while(scanf("%d%d",&n,&m)!=EOF)
    {
         memset(vis,0,sizeof(vis));
         memset(M,0,sizeof(M));
         for(int i=1;i<=m;i++)
         {
             int a,b;
             scanf("%d%d",&a,&b);
             if(a==b)
                continue;
             M[a][b]=1; M[b][a]=1;
         }
         int flag=0,cnt=0;
         for(int i=1;i<=n;i++)
         {
             int j;
             for(j=1;j<=n;j++)
             {
                 if(M[i][j])
                    break;
             }
             if(j<=n)
               dfs(i,++cnt);
         }
         for(int i=1;i<=n/3;i++)
         {
             int d=0;
             for(int j=1;j<=n;j++)
                if(vis[j]==i)
                    d++;
             if(d>3)
             {
                flag=1;
                break;
             }
             while(d<3)
             {
                 for(int k=1;k<=n;k++)
                    if(vis[k]==0)
                    {
                       vis[k]=i;
                       break;
                    }
                d++;
             }
         }
         for(int i=1;i<=n/3;i++)
         {
             int d=0;
             for(int j=1;j<=n;j++)
             {
                 if(vis[j]==i)
                        d++;
             }
             if(d<3)
             {
                 flag=12;
                 break;
             }
         }
         if(flag)
         {
             printf("-1\n");
             continue;
         }
         for(int i=1;i<=n/3;i++)
         {
            for(int j=1;j<=n;j++)
            {
                if(vis[j]==i)
                    printf("%d ",j);
            }
            printf("\n");
         }
    }
 return 0;
}

C题的话我们应该枚举(构造)结果,然后检查是否符合要求。然后的话就是一个排列组合的问题了。
注意一个公式:(a/b)%mod==a*pow(b,mod-2),mod是素数。这个公式可以用来快速算组合数。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

#define mod 1000000007
#define ll long long

ll f[1000009];

ll pow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans%mod;
}

int a,b,n;

bool check(ll x)
{
    while(x)
    {
        int i=x%10;
        if(i!=a&&i!=b)
            return false;
        x/=10;
    }
    return true;
}

int main()
{

    f[0]=1;
    for(int i=1;i<=1000001;i++)
        f[i]=f[i-1]*i%mod;
    while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    {
        ll ans=0;
        for(int i=0;i<=n;i++)
        {
            ll sum=(ll)i*a+(ll)(n-i)*b;
            if(check(sum))
            {
                ll d=f[i]*f[n-i]%mod;
                ans=(ans+f[n]*pow(d,mod-2)%mod)%mod;
            }
        }
        printf("%lld\n",ans);
    }
  return 0;
}

Codeforces 300-A/B/C

标签:codeforces

原文地址:http://blog.csdn.net/acm_lkl/article/details/44834609

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!