牛客编程巅峰赛S2第11场 - 青铜&白银&黄金题解报告

牛牛做水题

牛牛做水题题目链接
题目描述
牛牛喜欢做题。但他不喜欢做难题,喜欢做水题。
对于一个题号为的题而言,题目的难度为的所有因子之和除以。牛牛认为难度小于 2 的题目都是水题。
例如:
编号为25的题目,其难度为(1+5+25)/25=1.24<2,因此这道题是水题。
编号为28的题目,其难度为(1+2+4+7+14+28)/28=2,因此这道题不是水题。
编号为30的题目,其难度为(1+2+3+5+6+10+15+30)/30=2.4>2,因此这道题也不是水题。
牛牛拿到了一个共有道题目的题单,上面的题号为1、2、3、…、。牛牛把上面所有的水题刷了个遍。每做一道编号为的水题,牛牛可以获得的快乐指数。
牛牛想知道,自己一共能获得多少快乐指数?
输入样例

4

输出样例

10

在这里插入图片描述
分解质因子,开个 v e c t o r vector vector 存因子,最后求和除以当前数,最后值小于 2 则累计这个数作为开心值。

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回牛牛获得的快乐指数
     * @param n int整型 题单里的题目数量
     * @return int整型
     */
    int solve(int n) {
    
    
        // write code here
        vector<int>ans;
        vector<int>res;
        for(int i = 1; i <= n; i++)
        {
    
    
            res.clear();
            for(int j = 1; j <= i/j; j++)
            {
    
    
                if(i%j == 0)
                {
    
    
                    res.push_back(j);
                    if(j != i/j)
                    {
    
    
                        int t = i/j;
                        res.push_back(t);
                    }
                }
            }
            int tot = 0;
            for(auto it: res) tot += it;
            if(tot/i < 2) ans.push_back(i);
        }
        int sum = 0;
        for(auto x : ans)
            sum += x;
        return sum;
    }
};

牛牛浇树

牛牛浇树题目链接
题目描述
牛牛现在在花园养了 n n n 棵树,按顺序从第 1 棵到第 n n n 棵排列着。牛牛每天会按照心情给其中某一个区间的树浇水。例如如果某一天浇水的区间为 [2,4],就是牛牛在这一天会给第 2 棵,第 3 棵和第 4 棵树浇水。树被浇水后就会成长,为了简化问题,我们假设在初始时所有树的高度为 0 cm。每过去一天树会自然成长 1 cm,每次树被浇水后当天会额外成长 1 cm。m天中牛牛每天都都会选一个区间 [ l , r ] [l,r] [l,r] 对这个区间内的树进行浇水,牛牛想知道 m m m 天后有多少棵树的高度为奇数,你能告诉牛牛吗?
输入样例

3,2,[1,2],[2,3]

输出样例

2

函数共包含四个参数
第一个参数是一个 i n t int int 型参数 n n n
第二个参数是一个 i n t int int 型参数 m m m
第三个参数是一个共含有 m m m 个元素的 v e c t o r < i n t > vector<int> vector<int>型参数 l l l
第四个参数是一个共含有 m m m 个元素的 v e c t o r < i n t > vector<int> vector<int> 型参数 r r r
对于 100 % 100\% 100% 的数据:
1 ≤ n ≤ 2 e 5 1\leq n\leq 2e^5 1n2e5;
1 ≤ m ≤ 2 e 5 1\leq m\leq 2e^5 1m2e5;
1 ≤ l [ i ] ≤ r [ i ] ≤ 1\leq l[i]\leq r[i]\leq 1l[i]r[i] n n n

先差分处理,左端点 a l a_l al += 1,右端点 a r + 1 a_{r + 1} ar+1 -= 1,然后求一下前缀和,最后每个数 + m m m

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回m天后高度为奇数的树的数量
     * @param n int整型 
     * @param m int整型 
     * @param l int整型vector 
     * @param r int整型vector 
     * @return int整型
     */
    int oddnumber(int n, int m, vector<int>& l, vector<int>& r) {
    
    
        // write code here
        int a[200007] = {
    
    0};
        for(auto it : l) a[it] = a[it] + 1;
        for(auto it : r) a[it+1] = a[it+1] - 1;
        for(int i = 1; i <= n; i++) a[i] = a[i] + a[i-1];
        for(int i = 1; i <= n; i++) a[i] = a[i] + m;
        int ans = 0;
        for(int i = 1; i <= n; i++)
            if(a[i] & 1) ans++;
        return ans;
    }
};

挑选方案问题

挑选方案问题题目链接
题目描述
自助餐厅里有 5 个盘子,里面装的都是面包。
第 1 个盘子里有无限个面包;
第 2 个盘子里只有 1 个面包;
第 3 个盘子里只有 4 个面包;
第 4 个盘子里也有无限个面包,但必须两个两个地拿;
第 5 个盘子里也有无限个面包,但必须 5 个 5 个地拿;
给定正整数 n n n,求有多少种正好拿出 n n n 个面包的方案。
方案 a a a 和方案 b b b 不同,当且仅当方案 a a a 存在从某个盘子里拿出面包的数量与方案 b b b 中对应盘子拿出的数量不同。
输入样例

2

输出样例

6

找规律发现符合 a n s = ( n + 1 ) ( n + 2 ) / 2 ans = (n+1)(n+2)/2 ans=(n+1)(n+2)/2

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param n int整型 
     * @return long长整型
     */
    long long wwork(int n) {
    
    
        // write code here
        long long t = (long long) n;
        long long ans =(t+1)*(t+2)/2;
        return ans;
    }
};

总结

在这里插入图片描述
有空多做做思维题和数学题,成也数学,败也数学。

猜你喜欢

转载自blog.csdn.net/Edviv/article/details/111567098