和不超过K的三个数
题目描述:
给出一个长度为n的数组arr,和一个数k,找出数组中有多少组和小于k的三个数,即满足arr[a] + arr[b]+arr[c] < k,且0 <= a< b<c<n的三元组个数
- 输入描述:
第一行为一个整数n,代表输入数组的长度
第二行为n个整数,以空格隔开
第三行为一个整数k
- 输出描述
一个整数m,表示有多少组符合条件的三元组
输入
6
-2 0 1 2 3 6
输出
4
说明
有4个三元组之和小于2,即
[-2,0,1]
[-2,0,2]
[-2,0,3]
[-2,1,2]
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> data(n, 0);
int x;
for (int i = 0; i < n; i++) {
cin >> x;
data[i] = x;
}
int k;
cin >> k;
sort(data.begin(), data.end());
int cnt = 0;
for (int r = data.size() - 1; r >= 2; r--) {
int l = 0, m = r - 1;
while (l < m) {
int sum = data[r] + data[m] + data[l];
if (sum >= k) {
m--;
}
else {
cnt += m - l;
l++;
}
}
}
cout <<cnt;
return 0;
}
文件传输
服务器在数据备份,需要传输一批文件。在任意时间只能有一个文件被传输,一个文件传输需要一秒。现在有n批文件,我们知道这批文件加入传输队列的时间t(单位/秒),以及这批文件的个数c。
传输队列中的文件会以一秒一个的熟读进行传输,现在负责传输文件的同学想知道,所有文件被传输完的时刻,以及传达胡队列中的文件最大堆集数量。
输入描述:
第一行一个整数,代表有n批文件。接下来n行每行两个整数t,c,代表这批文件加入队列的时间和这批文件的个数。
输出描述:
输出一行两个整数,所有文件被传输完成的时刻和传输队列中文件堆集的最大数量。
实例:
输入:
3
1 1
2 1
3 1
输出:
4 1
输入:
3
1 3
2 3
3 3
输出
10 7
#include<iostream>
#include<queue>
using namespace std;
int main() {
int N;
cin >> N;
int time, n;
queue<int> q;
int max_n = 0;
int t = 1;
for (int i = 0; i < N; i++) {
cin >> time >> n;
int k = 1;
if (!q.empty()) {
k = q.back();
}
int timedis = time - k;
while (!q.empty() && timedis > 0) {
q.pop();
timedis--;
}
for (int i = 0; i < n; i++) {
q.push(time);
}
max_n = max(max_n, (int)q.size());
t = max(t, time);
}
t += q.size();
cout << t << ' ' << max_n;
}