牛牛做水题
牛牛做水题题目链接
题目描述
牛牛喜欢做题。但他不喜欢做难题,喜欢做水题。
对于一个题号为的题而言,题目的难度为的所有因子之和除以。牛牛认为难度小于 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 1≤n≤2e5;
1 ≤ m ≤ 2 e 5 1\leq m\leq 2e^5 1≤m≤2e5;
1 ≤ l [ i ] ≤ r [ i ] ≤ 1\leq l[i]\leq r[i]\leq 1≤l[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;
}
};
总结
有空多做做思维题和数学题,成也数学,败也数学。