get
- 被精度坑死了(B,C).遇到精度问题看能不能转化为整数,不行的话就用eps判断
A. If at first you don’t succeed…
题意
有两个聚会,A个人去第一个聚会,B个人去第二个聚会,C个人两个都去了,一共有N个人,至少有一个人一个聚会也没有去,问一共有几个人没有去聚会,如果无解输出-1
AC
#include <bits/stdc++.h>
#define N 200005
#define ll long long
using namespace std;
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int a, b, c, n;
cin >> a >> b >> c >> n;
if (a + b - c >= n || c >= n || a < c || b < c) cout << -1 << endl;
else cout << n - (a + b - c) << endl;
return 0;
}
B. Getting an A
题意
给一个长度为N序列,每个数最大为5。为改变几个数可以让平均数为5(四舍五入)
因为精度被hack
// 转化为整数处理
#include <bits/stdc++.h>
#define N 200005
using namespace std;
long long a[N], b[N];
vector<int> v;
// pair<int,int> sum[N];
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
int sum = accumulate(v.begin(), v.end(), 0);
int tar = (5 * n - n / 2);
sort(v.begin(), v.end());
if (sum >= tar) {
cout << 0 << endl;
return 0;
}
int ans = 0;
for (auto it : v) {
sum += (5 - it);
ans++;
if (sum >= tar) break;
}
cout << ans << endl;
return 0;
}
#include <bits/stdc++.h>
#define N 200005
using namespace std;
long long a[N], b[N];
vector<int> v;
// pair<int,int> sum[N];
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
int sum = accumulate(v.begin(), v.end(), 0);
if (sum * 1.0 / n >= 4.5) {
cout << 0 << endl;
return 0;
}
int ans = 0;
for (int i = 0; i < n; i++) {
sum += 5 - v[i];
ans++;
if (sum * 1.0 / n >= 4.5) break;
// cout << i << " " << sum << endl;
}
cout << ans << endl;
return 0;
}
// 精度错误
#include <bits/stdc++.h>
#define N 200005
using namespace std;
long long a[N], b[N];
double eps = 1e-5;
vector<int> v;
// pair<int,int> sum[N];
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end());
int sum = accumulate(v.begin(), v.end(), 0);
double now = sum * 1.0 / n;
if ( now >= 4.5) {
cout << 0 << endl;
return 0;
}
int ans = 0;
for (int i = 0; i < n; i++) {
// 含有小数的运算,容易出现精度问题
now += (5 - v[i]) * 1.0 / n;
ans++;
if (now >= 4.5 || fabs(now - 4.5) <= eps) break;
// cout << i << " " << sum << endl;
}
cout << ans << endl;
return 0;
}
C. Candies
题意
一共有N个糖果,Vasya每次吃K个,Petya吃剩下的%10 (向下取整),求在Vasya至少吃一半糖果的情况下最小的K
AC
// 二分
include <bits/stdc++.h>
#define N 200005
#define ll long long
using namespace std;
bool solve(ll n, ll m) {
ll sum_l = 0, sum_r = 0;
while (n > 0) {
if (n >= m)
sum_l += m;
else
sum_l += n;
n -= m;
if (n >= 10)
sum_r += n / 10;
n -= n / 10;
}
if (sum_l >= sum_r) return true;
else return false;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
ll n;
cin >> n;
ll l = 1, r = n;
while (l < r) {
ll mid = (l + r) / 2;
if (solve(n, mid))
r = mid;
else
l = mid + 1;
}
cout << l << endl;
return 0;
}