1. 小美浇花:
题目: 给花浇水和施肥,每天都可以浇水,获得 x
分,每隔两天可以施肥获得 y
分,施肥和浇水可以在同一天进行,求达到 z
分至少需要多少天?
示例:
输入:
1 2 12 // 浇水 施肥 目标
输出:
7 // 需要 7 天
代码:
#include
using namespace std;
typedef long long int64;
void solve() {
int64 x, y, z;
cin >> x >> y >> z;
int64 sum = 0;
int64 cnt = 0;
while (sum < z) {
if (cnt % 3 == 0) sum += (x + y); // 0 3 6
else sum += x; // 1 2 4 5
++cnt;
}
cout << cnt;
}
int main() {
solve();
return 0;
}
2. 账单计算:
题目: 群收款问题,有 n
笔账单,m
个人,每笔账单 k
个人参与,共 c
元,没人均摊,输出每个人最后总共要给小红的钱。(每个人给的钱向上取整)
示例:
输入:
2 3 // 2 份账单,3 个额外的人
3 10 // 3 人吃了 10 块
1 3 // 1 3 吃的
4 12 // 4 人吃了 12块
1 2 3 // 1 2 3 吃的
输出:
7 3 7 // 分别给小美 7 3 7 元
代码:
#include
using namespace std;
typedef long long int64;
void solve() {
int64 n, m;
cin >> n >> m;
int k, c;
map<int, int> res;
for (int i = 0; i < n; ++i) {
cin >> k >> c;
int mean = (c + k - 1) / k;
for (int t, j = 0; j < k; ++j) {
cin >> t;
res[t] += mean;
}
}
for (auto r : res) {
cout << r.second << " ";
}
}
int main() {
solve();
return 0;
}
3. 修改后的最大和
题目: 长度为 n
的数组 a
,每次可以任选两个数 a[i]
a[j]
,再自己构造 x
和 y
满足 x*y = a[i]*a[j]
,然后把 x
和 y
替换 a[i]
和 a[j]
,问 k
次操作后数组所有元素和最大值。
示例:
输入:
5 2 // 5 个数 操作 2 次
1 4 3 5 2 // 具体的数
输出:
65
代码:
#include
using namespace std;
typedef long long int64;
static bool cmp(int64 a, int64 b) {return a > b;}
void solve() {
int64 n, k;
cin >> n >> k;
vector<int> nums(n, 0);
for (int tmp, i = 0; i < n; ++i) {
cin >> tmp;
nums[i] = tmp;
}
sort(nums.begin(), nums.end(), cmp);
int64 tmp = 0;
for (int64 i = 1; i <= k; ++i) {
tmp = nums[i] * nums[0];
nums[0] = tmp;
nums[i] = 1;
}
int sum = 0;
for (auto num : nums) {
sum += num;
}
cout << sum;
}
int main() {
solve();
return 0;
}
4. 重新排序
题目:两个长度相同的数组 a
和 b
,问能否重排 a
数组使得对于所有的下标 i
,满足:1 <= a[i] + b[i] <= m
思路:将 a
从小到大,b
从大到小排序,再比较。
代码:
#include
using namespace std;
typedef long long int64;
static bool cmp(int64 a, int64 b) {return a > b;}
void solve() {
int64 n, m;
cin >> n >> m;
vector<int> a(n), b(n);
for (auto& num : a) cin >> num;
for (auto& num : b) cin >> num;
sort(a.begin(), a.end());
sort(b.begin(), b.end(), cmp);
for (int i = 0; i < n; ++i) {
int sum = a[i] + b[i];
if (sum < 1 || sum > m) {
cout << "NO";
return;
}
}
cout << "Yes";
}
int main() {
solve();
return 0;
}
5. 平均前缀和
题目:长度为 n
的数组 a
,问平均值恰好等于 k
的最长子数组长度。
思路:
代码: