和小于K的三元组个数
图片来源于网络,侵删。
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i)
cin >> nums[i];
int k;
cin >> k;
sort(nums.begin(), nums.end());
int res = 0;
for (int third = n - 1; third >= 2; --third) {
int i = 0;
int j = third - 1;
while (i < j) {
int cur = nums[i] + nums[j] + nums[third];
if (cur < k) {
res += j - i;
++i;
}
else
--j;
}
}
cout << res << endl;
}
文件传输
题目: 有n个要传输的文件堆,在第t
时刻会将文件数量为m
的文件堆加入队列,服务器每次只能传输一个文件,求解服务器将所有文件传输完需要的时间,以及队列中最大的文件数量。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> nums(n, vector<int>(2));
for (int i = 0; i < n; ++i)
cin >> nums[i][0] >> nums[i][1];
sort(nums.begin(), nums.end());
long t = 0;
long res = 0;
long cur = 0;
for (int i = 0; i < n; ++i) {
if (i == 0)
t = nums[0][0];
cur += nums[i][1];
res = max(res, cur);
if (i < n - 1) {
while (t < nums[i+1][0]) {
cur = cur > 0 ? cur - 1: 0;
++t;
}
}
else {
while (cur > 0) {
--cur;
++t;
}
}
}
cout << t << " " << res << endl;
return 0;
}
最大得分
LeetCode486. Predict the Winner
leetcode486是判断先选择的人是否能赢,稍微改动一下就好,dp[i][j]
表示先选择的人能够多获得的分数,将结果转换得到先选择的人最多能获得的分数。
int main()
{
int n;
cin >> n;
vector<int> nums(n);
int sum = 0;
for (int i = 0; i < n; ++i) {
cin >> nums[i];
sum += nums[i];
}
vector<vector<int>> dp(n, vector<int>(n));
for (int i = 0; i < n; ++i)
dp[i][i] = nums[i];
for (int len = 1; len < n; ++len) {
for (int i = 0; i + len < n; ++i) {
int j = i + len;
dp[i][j] = max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);
}
}
int res = 0;
res += (sum - dp[0][n - 1]) / 2 + dp[0][n - 1];
cout << res << endl;
}