6074. 字母在字符串中的百分比
统计字符数量/总数量
class Solution {
public:
int percentageLetter(string s, char letter) {
int n = s.size(), cnt = 0;
for(auto& c : s){
if(letter == c) cnt++;
}
return (cnt*100)/n;
}
};
6075. 装满石头的背包的最大数量
贪心题, 计算背包中的剩下的空间,剩下的空间从小到大排序,增加的石子数减去。
class Solution {
public:
int maximumBags(vector<int>& c, vector<int>& r, int a) {
int n = c.size();
vector<int> s;
int res = 0;
for(int i=0; i<n; i++){
if(c[i] - r[i] > 0){
s.push_back(c[i]-r[i]);
}else res++;
}
sort(s.begin(), s.end());
for(int i=0; i<s.size(); i++){
int t = min(s[i], a);
s[i] -= t;
a -= t;
}
for(int i=0; i<s.size(); i++){
if(s[i] == 0) res++;
}
return res;
}
};
6076. 表示一个折线图的最少线段数
枚举, 注意精度问题, 这里是化简为最简分数比较
class Solution {
public:
int minimumLines(vector<vector<int>>& s) {
int n = s.size();
if(n == 1) return 0;
if(n == 2) return 1; // 两天确定一条直线
sort(s.begin(), s.end());
int res = 1;
for(int i=2; i<n; i++){
int x1 = s[i-1][0] - s[i-2][0], y1 = s[i-1][1] - s[i-2][1];
int x2 = s[i][0] - s[i-1][0], y2 = s[i][1] - s[i-1][1];
int g = __gcd(x1, y1);
x1 /= g, y1 /= g;
g = __gcd(x2, y2);
x2 /= g, y2 /= g;
if(x1 != x2 || y1 != y2) res++;
}
return res;
}
};
6077. 巫师的总力量和
通过每一个数组的贡献来计算,以 最为最小值,最左边小于等于 的第一个位置 和最右边的大小 的第一个位置 .
给定 , ,s为前缀和, ss为前缀和的前缀和 求:
=
=
=
单调栈 + 前缀和
class Solution {
public:
int totalStrength(vector<int>& s) {
int mod = 1e9+7;
int n = s.size();
vector<int> left(n, -1), right(n, n);
stack<int> st;
for(int i=0; i<n; i++){
while(!st.empty() && s[st.top()] >= s[i]){
right[st.top()] = i;
st.pop();
}
if(!st.empty()){
left[i] = st.top();
}
st.push(i);
}
long long sum = 0L;
vector<int> ss(n+2);
for(int i=1; i<=n; i++){
sum += s[i-1];
ss[i+1] = (ss[i]+sum)%mod;
}
int res = 0;
for(int i=0; i<n; i++){
long l = left[i]+1, r = right[i]-1;
long total = ((i-l+1)*(ss[r+2]-ss[i+1]) - (r-i+1)*(ss[i+1]-ss[l]))%mod;
res = (res + total*s[i])%mod;
}
return (res+mod)%mod;
}
};