牛客2023年情人节比赛 (c/c++题解)

比赛链接:https://ac.nowcoder.com/acm/contest/51663

咳咳~~我突然发现牛客比赛里面,可能打的人最少的就是情人节专场了~~

因为都去陪女朋友啦~~~,只有我们单身狗才会来做吧,呜呜呜呜!

不多说,上题:

A    回眸

链接:https://ac.nowcoder.com/acm/contest/51663/A

题目描述:


已知走廊的长度是a。小红和小紫分别从走廊的两端相向而行(小红从左到右,小紫从右到左),小红初始速度为v1​,小紫的初始速度为v2​。当小红和小紫相遇的时刻,小红会让自己的速度下降至v1’​。求小红从左端走到右端一共需要花的时间。

输入描述:

四个正整数a,v1,v2,v1’,用空格隔开。

1≤a,v1,v2,v1’,≤100
v1’,<v1

输出描述:


一个浮点数,用来表示小红总共需要花费的时间。如果你的答案和标准答案的相对误差不超过10^-6,则认为你的答案正确。

示例1

输入

复制

4 2 2 1

输出

复制

3.00

说明:

小红和小紫花费1秒时间在走廊中点相遇,之后小红的速度降为1,花费2秒走到终点。

题目思路:

①首先输入各种未知数a,v1,v2,v1’。

②然后的话其实就是做物理数学题了,解方程啥的

③就是先求出相遇时间t1=a/(v1+v2);

④找到剩余路程s1=a-v1*t1;

⑤然后就是求出剩余时间t2=s1/va,最后就是求总的时间t1+t2了;

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long  a,v1,v2,va;
    cin>>a>>v1>>v2>>va;
    double t;
    double t1,t2;
    double s1,s2;
    t1=a*1.0/(v1+v2);
    s1=a*1.0-v1*1.0*t1;
    t2=s1/(va*1.0);
    cout<<t1+t2;
    return 0;
}

B    暧昧

链接:https://ac.nowcoder.com/acm/contest/51663/B​​​​​​

题目描述 :

定义一个01串的权值为:任选一个'0'和一个'1',选择不同下标的方案数。例如,"0100"的权值为3:{1,2}、{3,2}和{4,2}共三种方案。

小红想知道,长度为n的所有01串的权值之和为多少?答案请对10^9+7取模。
提示:长度为n的01串共有2^n个。

输入描述:

一个正整数n
1≤n≤10^9

输出描述:

所有长度为n的01串的权值之和,答案对10^9+77取模。

示例1

输入

复制

2

输出

复制

2

说明:

"00"和"11"的权值为0,"10"和"01"的权值为1,所以总权值为2。

题目思路:

这个类似于排列组合吧

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,s,a,t=2,mod=1e9+7;
	cin>>n;
    s=n*(n-1)/2%mod;
	a=n-1;
	while(a)
	{
		if(a%2)
            s=s*t%mod;
		t=t*t%mod;
        a=a/2;
	}
	cout<<s;
	return 0;
}

C   悸动的距离

链接:https://ac.nowcoder.com/acm/contest/51663/C

题目描述:


平面直角坐标系中,小红站在A点,坐标是(xA,yA);小紫站在B点,坐标是(xB,yB)​。小红想知道,若她和小紫之间连一条线段,线段和坐标轴共有多少个交点?

输入描述: 


四个整数xA,yA,xB,yB,用空格隔开。

−100≤xA,yA,xB,yB≤100

保证线段AB不在坐标轴上。保证A点和B点不重合。

输出描述:

线段AB和坐标轴的交点数量

示例1

输入

复制

1 1 -1 -1

输出

复制

1

说明

线段AB和两个坐标轴的交点重合了,因此只有一个交点。

示例2

输入

复制

3 0 0 3

输出

复制

2

说明

端点在坐标轴上也视为有交点

示例3

输入

复制

2 -1 2 3

输出

复制

1

示例4

输入

复制

-9 2 -2 9

输出

复制

0

题目思路:

①首先输入xa,ya,xb,yb,并定义一个cnt初值为0来计数(与坐标轴相交的个数)

②其实要判断是否与坐标轴相交很简单,就是一个在坐标轴上一个在坐标轴下就好啦

③因此就有xa*xb<=0或者ya*yb<=0,就让计数cnt加1

④但是这个地方要非常注意的就是,这个可能会有重复,即是通过坐标原点,因此这个地点我们需要判断一下。

⑤于是有,当xa*yb==xb*ya时,cnt减去一个1,最后就是输出cnt就结束啦

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int xa,ya,xb,yb;
    cin>>xa>>ya>>xb>>yb;
    int cnt=0;
    if(xa*xb<=0)
    {
        cnt++;
    }
    if(ya*yb<=0)
    {
        cnt++;
    }
    if(cnt==2)
    {
        if(xa*yb==xb*ya)
        {
            cnt--;
        }
    }
    cout<<cnt;
    return 0;
}

E    暖色记忆

链接:https://ac.nowcoder.com/acm/contest/51663/E

题目描述:



小红拿到了一个长度为n的数组(保证n为偶数),她将进行如下操作:
1. 选择一个元素,将其染红。
2. 选择一个未被染红的元素,将其删除。
3. 使得所有被染红的元素除以2,向下取整。

小红将进行n/2次操作,操作后数组将剩下n/2个染红的元素。小红希望这n/2个数的和尽可能大,你能帮帮她吗?

输入描述:


第一行输入一个正整数n,代表数组的大小。
第二行输入n个正整数aii​,代表数组的元素。
1≤n≤10^5
1≤ai≤10^9

输出描述:

小红操作结束后,最后元素之和的最大值。

示例1

输入

复制4 1 2 3 4

1 2 3 4

输出

复制

2

说明

先选择第二个数染红,删除第一个数,然后将染红的数除以2,数组变成 [1,3,4]
然后选择将4染红,删除3,然后将染红的数除以2,数组变成 [0,2]

题目思路:

这个题目就是用排列,将从大到小把数排列出来,然后再用二进制右移运算符。将一个数的各二进制位全部右移1位,正数左补0,负数左补1,右边丢弃。然后判断是否小于n/2,满足就可以加到sum里面,然后输出sum。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    long long a[10001000];
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1,greater<int>());
    long long sum = 0;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= i;j++)
        {
            a[i]=a[i]>>1;
            if(a[i]==0)  
                break;
        }
        if(i<=n/2)  
           sum += a[i];
    }
    cout << sum << endl;
}

这就是单身狗的比赛了,总的来说大部分题目是简单滴。但是有几个题目还是难度的,这次写了A,B,C,E的题解,剩下的有时间再补题吧,我是大菜鸟,勿喷!

干就完了呗!大学牲们冲鸭,2023年第一个比赛题解!!!

嘿嘿,run润。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值