牛客编程巅峰赛S2第4场

比赛链接:
青铜&白银&黄金
钻石&王者


A:牛牛掷硬币

  直接调用库函数即可。

return to_string(pow(0.5,n)*2+0.005).substr(0,4);

B:牛牛摆玩偶

  这道题的做法是采用二分的方式。二分最近距离的最大值,然后检查能不能按照这种间隔摆放玩偶。摆放的时候是采用贪心的策略,尽可能地让摆放的距离等于我们枚举的二分答案。注意先要给结构体排序!

vector<Interval> s;
int nn,mm,size;
typedef long long ll;
bool cmp(Interval a,Interval b){
    
    
    if(a.end==b.end) return a.start<b.start;
    else return a.end<b.end;
}
class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n int整型 玩偶数
     * @param m int整型 区间数
     * @param intervals Interval类vector 表示区间
     * @return int整型
     */
    bool check(ll D)
    {
    
    
        ll lastpos=-D;int sum=0;
        for(int i=0;i<mm;++i)
        {
    
    
            ll sta=max(lastpos+D,(ll)s[i].start);
            while(sta<=s[i].end) sum++,sta+=D;
            lastpos=sta-D;
        }
        if(sum>=nn) return true;
        else return false;
    }
    int doll(int n, int m, vector<Interval>& intervals) {
    
    
        nn=n,mm=m,s=intervals;
        sort(s.begin(),s.end(),cmp);
        ll l=0,r=1e18;
        while(l+1<r)
        {
    
    
            ll mid=(r-l)/2+l;
            if(check(mid)) l=mid;
            else r=mid;
        }
        return l;
    }
};

C:交叉乘

  我们令 T [ l ] = ∑ i = l n a i ∗ ∑ j = i + 1 n a j , s u m [ l ] = ∑ i = l n a i T[l]=\sum_{i=l}^n a_i * \sum_{j=i+1} ^n a_j,sum[l]=\sum_{i=l} ^n a_i T[l]=i=lnaij=i+1naj,sum[l]=i=lnai,那么最终求解的答案就应该是: S = T [ l ] − T [ r + 1 ] − ( s u m [ l ] − s u m [ r + 1 ] ) ∗ s u m [ r + 1 ] S=T[l]-T[r+1]-(sum[l]-sum[r+1])*sum[r+1] S=T[l]T[r+1](sum[l]sum[r+1])sum[r+1]

const int maxn=1e5+100;
const int mod=1000000007;
typedef long long ll;
ll T[maxn],sum[maxn];
class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 多次求交叉乘
     * @param a int整型vector a1,a2,...,an
     * @param query int整型vector l1,r1,l2,r2,...,lq,rq
     * @return int整型vector
     */
    vector<int> getSum(vector<int>& a, vector<int>& query) {
    
    
        int size=a.size();sum[size]=0;T[size]=0;
        //int rec=size;
        for(int i=size-1;i>=0;--i)  sum[i]=(sum[i+1]+a[i])%mod;
        for(int i=size-1;i>=0;--i)  T[i]=(T[i+1]+sum[i+1]*a[i]%mod)%mod;
        int num=query.size();num/=2;
        vector<int> ans;ans.clear();
        for(int i=0;i<num;++i)
        {
    
    
            int l=query[i*2]-1,r=query[i*2+1]-1;
            if(l==r) {
    
    ans.push_back(0);continue;}
            ll tot=(((T[l]-T[r+1])%mod-(sum[l]-sum[r+1])%mod*sum[r+1]%mod)%mod+mod)%mod;
            ans.push_back(tot);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/CUMT_William_Liu/article/details/111590572