牛客周赛 Round 56(A~E)

目录

A.面包店的故事

B.放课后故事

C.异或故事 

D.构造故事

E.约会故事


A.面包店的故事

思路: 签到题

C++代码:

void solve()
{  
   int a,b,c;cin>>a>>b>>c;
   int sum=b+a;
   cout<<(sum<=c?"YES":"NO");
}

B.放课后故事

思路:注意在纸足够多的情况下,分到的人不会超过m+1

C++代码:

void solve()
{  
   int n,m,k;cin>>n>>m>>k;
   int sum=0,cnt=0;
   for(int i=0;i<n;i++)
   {
     int x;cin>>x;
     sum+=x;
     cnt+=sum/k;
     sum%=k;
   }
   if(cnt>=m+1) cout<<m+1;
    else cout<<cnt;
}

C.异或故事 

 

思路根据异或的性质我们得出,用1去异或上一个数n,如果n为奇数则得到n−1,否则我们会得到n + 1,由此,们发现,直接用1去异或就好了嘛,但考虑特殊的两个数,输入为1或1e9时,我们发现,用1去异或得到的两个数为0和1e9 + 1,不在我们要求的范围内,所以我们特判一下这两个数即可

C++代码:

void solve()
{  
   int t;cin>>t;
   while(t--)
   {
       int x;cin>>x;
       if(x==1e9)
       {
           cout<<"999999999 1023"<<endl;
           continue;
       }
       else if(x==1) cout<<"2 3"<<endl;
       else cout<<1<<' '<<(1^x)<<endl;
   }
}

D.构造故事

思路:贪心+排序,依次枚举三条最大的边,如果符合三角形的三边关系则退出循环,否则输出-1

C++代码:

void solve()
{  
   int t;cin>>t;
   while(t--)
   {
    int n;cin>>n;
    vector<int> v(n);
    for(auto &it:v) cin>>it;
    sort(v.begin(),v.end());
    int maxd=0;

    for(int i=v.size()-1;i-2>=0;i--)
    {
        if(v[i]+v[i-1]>v[i-2]&&v[i]-v[i-1]<v[i-2])
        {
            maxd=max(maxd,v[i]+v[i-1]+v[i-2]);
            break;
        }
    }
    if(maxd) cout<<maxd<<endl;
    else cout<<-1<<endl;
   }
}

E.约会故事

输入样例:

3 2
00:03 00:47
00:30 01:23
12:00 17:00
Lemonade Cappuccino
5
00:35
12:00 12:00
Cappuccino
01:23
13:00 12:59
Cappuccino
01:15
11:00 12:43
WaTer
01:24
09:24 11:00
Lemonade
23:59
08:00 07:43
LeMonade

输出样例:

Winner xqq
Joker xqq
Joker xqq
Loser xqq
Loser xqq

思路:一个模拟题,首先我们该如何判断xqq发出邀请的时间是在小c的开心时间呢,其实我们只需要将小c每次开心的起始时间和结束时间,转化为分钟,用一个数组标记即可,我们还要注意可能会存在跨天的情况,此时结束时间小于开始时间,我们只需要标记0分钟到结束时间的分钟就可以了,具体请看代码(这道题用stoi函数可以将字符串转化为整型)。

C++代码:

void solve()
{  
   cin>>n>>m;
   for(int i=0;i<n;i++)
   {
    string s1,s2;cin>>s1>>s2;
    int h1=stoi(s1.substr(0,2));
    int m1=stoi(s1.substr(3,2));
    int t1=h1*60+m1;
    int h2=stoi(s2.substr(0,2));
    int m2=stoi(s2.substr(3,2));
    int t2=h2*60+m2;

    if(t1<t2)
    {
        for(int i=t1;i<=t2;i++) a[i]=1;
    }
    else
    {
        for(int i=0;i<=t2;i++) a[i]=1;
    }
   }  
   set<string> s;
   for(int i=0;i<m;i++)
   {
    string b;cin>>b;
    s.insert(b);
   } 

   cin>>q;
   while(q--)
   {
    string tim,s1,s2,s3;cin>>tim>>s1>>s2>>s3;
    int h=stoi(tim.substr(0,2));
    int m=stoi(tim.substr(3,2));
    int t=h*60+m;
    int h1=stoi(s1.substr(0,2));
    int m1=stoi(s1.substr(3,2));
    int t1=h1*60+m1;
    int h2=stoi(s2.substr(0,2));
    int m2=stoi(s2.substr(3,2));
    int t2=h2*60+m2;

    if(t>119||!a[t])
    {
        puts("Loser xqq");
        continue;
    }
    if(t1>t2||!s.count(s3))
    puts("Joker xqq");
    else puts("Winner xqq");

   }
}

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法数据结构进行有效地结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperRandi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值