比赛链接: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润。