组队赛4(2013成都)


H - Hard Disk Drive 

      纯水题,直接贴代码;

     

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int main()
{
    int T;
    char str[10];
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        int m;
        scanf("%d[",&m);
       // strcpy(str,"\0");
        scanf("%s",&str);
        double x=1000.0/1024;
       if(strcmp(str,"B]")==0)
       {
           printf("Case #%d: 0.00%%\n",i);
       }
       if(strcmp(str,"KB]")==0)
       {
            printf("Case #%d: %.2f%%\n",i,(1-x)*100);
       }
       if(strcmp(str,"MB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x)*100);
       }
       if(strcmp(str,"GB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x)*100);
       }
       if(strcmp(str,"TB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x*x)*100);
       }
       if(strcmp(str,"PB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x*x*x)*100);
       }
       if(strcmp(str,"EB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x*x*x*x)*100);
       }
       if(strcmp(str,"ZB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x*x*x*x*x)*100);
       }
       if(strcmp(str,"YB]")==0)
       {
           printf("Case #%d: %.2f%%\n",i,(1-x*x*x*x*x*x*x*x)*100);
       }
    }
    return 0;
}

J - Just Random

        这道题刚开始老是T,但是就是当时就是想不到好的办法。今天在网上看到了比较好的思路。/*

这题就是要找在[a,b]  [c,d] 之间,和模p等于m的对数。

把[a,b] [c,d]所有可能组合的和写成下列形式。
a+c   a+c+1   a+c+2    ..................   a+d
        a+c+1   a+c+2    a+c+3 ........   a+d  a+d+1
                    a+c+2    a+c+3           a+d   a+d+1   a+d+2
                                       ....................
                                          ...................
                                            b+c   b+c+1   ...............................................b+d;
上面大致形成一个斜的矩阵。
使用b+c  和 a+d两条竖线,就可以分成三部分。前后两部分个数是等差数列,中间个数是相等的。
只需要讨论下b+c 和 a+d的大小。  然后找到%p==m 的位置,求和就可以搞定了。
*/

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
__int64 gcd(__int64 a,__int64 b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        __int64 a,b,c,d,p,q;
        scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&p,&q);
        __int64 ans=0;
         if(b-a>d-c) swap(b,d),swap(a,c);
        __int64 he,en,m,n,u,v,s,t;
//前半部分
        m=(a+c)%p;
        he=(q+p-m)%p;
        n=(he+a+c-q)/p;
        u=(b+c-1)%p;
        en=(u-q+p)%p;
        v=(b+c-1-en-q)/p;
        ans+=(v-n+1)*(he+1)+(v-n)*(v-n+1)/2*p;
//中间
        m=(b+c)%p;
        he=(p+q-m)%p;
        n=(b+c+he-q)/p;
        u=(a+d)%p;
        en=(u+p-q)%p;
        v=(a+d-en-q)/p;
        ans+=(v-n+1)*(b-a+1);
//后半部分
        m=(a+d+1)%p;
        he=(p+q-m)%p;
        n=(a+d+1+he-q)/p;
        u=(b+d)%p;
        en=(u+p-q)%p;
        v=(b+d-en-q)/p;
        ans+=(v-n+1)*(en+1)+(v-n+1)*(v-n)/2*p;

        __int64 sum=(b-a+1)*(d-c+1);
        __int64 gc=gcd(sum,ans);
        printf("Case #%d: %I64d/%I64d\n",i,ans/gc,sum/gc);
    }
    return 0;
}


F - Fibonacci Tree

   比赛的时候队友做出了这道题,我当时没理解。然后在网上看了许多解题报告,

   题意是问能否由白色边构成一个生成树,然后生成树的白边数是一个斐波那契数列。

   思路,通过并查集来判断生成树的情况,然后只要在最大的白边数和最小的白边数间存在斐波那契数就可以了。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#define maxn 100005
using namespace std;
int fa[maxn],fo[maxn];
int m,n;
struct
{
    int a,b,c;
}edge[maxn];
int find(int x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
int solve(int p)
{
    int sum=0;
    for(int j=1;j<=maxn;j++) fa[j]=j;
    for(int j=1;j<=n;j++)
        if(edge[j].c!=p)
        {
            int u=find(edge[j].a);
            int v=find(edge[j].b);
            if(u!=v)
            {
                fa[u]=v;
                sum++;
            }
        }
    return sum;
}
int main()
{
    int t,l=2;
    scanf("%d",&t);
    fo[0]=1;
    fo[1]=2;
    for(l=2;;l++)
    {
        fo[l]=fo[l-1]+fo[l-2];
        if(fo[l]>=maxn) break;
    }
    for(int i=1;i<=t;i++)
    {
        scanf("%d%d",&m,&n);
        for(int j=1;j<=n;j++)
            scanf("%d%d%d",&edge[j].a,&edge[j].b,&edge[j].c);
        int x1=solve(10);
        if(x1!=m-1)
        {
                printf("Case #%d: No\n",i);
                    continue;
        }
        bool flag=0;
        int x2=solve(0);
        int x3=m-1-solve(1);
        for(int j=0;j<=l;j++)
            if(x2>=fo[j]&&x3<=fo[j])
                    flag=1;
        if(flag)    printf("Case #%d: Yes\n",i);
        else   printf("Case #%d: No\n",i);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Mirror是一种非常有用的组队工具,它允许多个玩家共享和交互的游戏世界。无论是开发多人在线游戏、合作游戏还是竞技游戏,Unity Mirror都能提供强大的网络功能。 借助Unity Mirror,我们可以轻松地创建一个支持多人游戏的环境。无论是局域网还是互联网,Unity Mirror都能提供稳定的网络连接,并且具备较低的延迟。这使得玩家可以流畅地与其他玩家一起玩游戏,共同完成任务或对战。 Unity Mirror还提供了丰富的同步功能,如角色同步、物体同步和动画同步等等。这些功能确保了游戏中的所有玩家都能看到并与同一游戏世界进行互动。无论玩家在哪个地点,都能感受到与其他玩家的实时互动。 在组队方面,Unity Mirror提供了简便的方式来创建和管理队伍。我们可以很容易地将玩家分配到不同的队伍,并且提供相应的组队功能。例如,我们可以实现队伍内成员之间的实时通讯,协同作战和分享资源等等。 通过Unity Mirror,我们可以创建一个灵活且强大的多人游戏体验。无论是与好友合作还是与陌生人对战,多人游戏的乐趣将大大增加。Unity Mirror的出色网络功能和组队管理能力,使得游戏开发者能够设计出更具互动性和社交性的游戏。 总之,Unity Mirror是一个非常适合组队游戏的工具,它提供了可靠的网络连接、实时的同步功能以及便捷的组队管理。无论是作为游戏开发者还是玩家,我们都可以享受到Unity Mirror带来的多人游戏乐趣。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值