Codeforces Round #491 (Div.2)

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;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/80790732