A 牛牛掷硬币
解题思路:硬币全部向上或向下,概率即为1/2^(n-1),保留到小数位最后两位并四舍五入,可以发现1/2^7约为0.007,四舍五入为0.01,1/2^8约为0.039,四舍五入为0.00,故在n>=9时答案全为0.00,n<9时可以直接求,然后转换为string类型返回。
class Solution {
public:
/**
* 返回一个严格四舍五入保留两位小数的字符串
* @param n int整型 n
* @return string字符串
*/
string Probability(int n) {
string str[]={"1.00","0.50","0.25","0.13","0.06","0.03","0.02","0.01"};
if(n>=9)return "0.00";
else return str[n-1];
}
};B 牛牛摆玩偶
解题思路:区间内才能放玩偶且要放完,最小间隔若更小依然能将所有玩偶放完,但若更大则不能全部放完,满足二分的条件,故使用二分法来找最小间隔的最大值。
/**
* struct Interval {
* int start;
* int end;
* Interval(int s, int e) : start(start), end(e) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型 玩偶数
* @param m int整型 区间数
* @param intervals Interval类vector 表示区间
* @return int整型
*/
typedef long long ll;
int doll(int n, int m, vector<Interval>& intervals) {
// write code here
sort(intervals.begin(),intervals.end(),[&](Interval &a,Interval &b)->bool{return a.start<b.start;} );
ll l=0,r=INT_MAX,ans=0;
while(l<=r)
{
ll mid=(l+r)/2;
if(check(intervals,mid,n))
{
ans=mid;
l=mid+1;
}
else r=mid-1;
}
return ans;
}
bool check(vector<Interval>& intervals,ll mid,int n)
{
ll now=intervals[0].start+mid;
int num=1;
for(int i=0;i<(int)intervals.size();++i)
{
if(now>intervals[i].end)continue;
now=max(now,(ll)intervals[i].start);//第i个区间里符合间隔mid的第一个位置
int x=(intervals[i].end-now)/mid+1;
num+=x;
now+=mid*x;
}
return num>=n;
}
};C 交叉乘
解题思路:做题的时候没思路,听了讲解就两个字,妙啊!(还是我太菜了~)
1✖1.........1✖n
. .
. .
n✖1.........n✖n
题目求的就是主对角线下面的等式之和,矩阵里对角线上面的元素和下面的元素和相同,故可以总体来求,答案如下图:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 多次求交叉乘
* @param a int整型vector a1,a2,...,an
* @param query int整型vector l1,r1,l2,r2,...,lq,rq
* @return int整型vector
*/
typedef long long ll;
vector<int> getSum(vector<int>& a, vector<int>& query) {
// write code here
int n=a.size(),m=query.size();
vector<__int128>sum(n+1,0);
vector<__int128>sumsq(n+1,0);
for(int i=0;i<n;++i)
{
sum[i+1]=sum[i]+a[i];//a前缀和
sumsq[i+1]=sumsq[i]+1LL*a[i]*a[i];//平方和前缀和
}
vector<int>ans(m/2,0);
for(int i=0;i<m;i+=2)
{
int l=query[i],r=query[i+1];
__int128 tmp=sum[r]-sum[l-1];
tmp=tmp*tmp-(sumsq[r]-sumsq[l-1]);
tmp=(tmp/2)%1000000007;
ans[i/2]=tmp;
}
return ans;
}
};
京公网安备 11010502036488号