2021年1月17日sdut vj个人赛

A - City of Lights

题目链接
签到题。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, k;
int a[N];
int main() {
    
    
    cin >> n >> k;
    int cnt = 0;
    int maxx = 0;
    memset(a, 0, sizeof a);
    for (int i = 0; i < k; i++) {
    
    
        int x;
        cin >> x;
        for (int j = 1; j <= n / x; j++) {
    
    
            if (a[j * x] == 0) {
    
    
                a[j * x] = 1;
                cnt++;
            } else {
    
    
                a[j * x] = 0;
                cnt--;
            }
        }
        maxx = max(maxx, cnt);
    }
    cout << maxx << endl;
    return 0;
}

B - Blurred Pictures

题目链接

题意:

找能裁剪的最大的正方形,边长从1开始遍历,从上往下遍历,然后进行判断。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int x[N], y[N];
int n;

int judge(int upside, int l) {
    
    
    if (x[upside] + l > y[upside]) return 0;
    if (upside + l > n) return 0;
    int downside = upside + l;
    int left = max(x[upside], x[downside]);
    if (left + l <= y[upside] && left + l <= y[downside]) return 1;
    return 0;
}

int main() {
    
    
    int maxx = 1;
    cin >> n;
    for (int i = 1; i <= n; i++) {
    
    
        cin >> x[i] >> y[i];
    }
    for (int i = 1; i <= n; i++) {
    
    
        while (judge(i, maxx)) maxx++;
    }
    cout << maxx << endl;
}

D - Monument Tour

题目链接

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int X, Y;
struct node {
    
    
    int x, y;
} p[N];
int maxx[N], minn[N], lie[N];
bool cmp(node a, node b) {
    
     return a.y < b.y; }

int main()
{
    
    
        cin >> X >> Y;
        memset(p, 0, sizeof p);
        memset(maxx, -1, sizeof maxx);
        memset(minn, 0x3f, sizeof minn);
        memset(lie, 0, sizeof lie);
        int n;
        cin >> n;
        long long pos = 0;
        for (int i = 0; i < n; i++) {
    
    
            cin >> p[i].x >> p[i].y;
            maxx[p[i].x] = max(maxx[p[i].x], p[i].y);
            minn[p[i].x] = min(minn[p[i].x], p[i].y);
        }
        long long cnt = 0;
        for (int i = 0; i < 100005; i++) {
    
    
            if (maxx[i] != -1 && minn[i] != 0x3f3f3f3f) {
    
    
                lie[cnt++] = maxx[i];
                lie[cnt++] = minn[i];
            }
        }
        sort(lie, lie + cnt);
        long long mid = lie[(cnt - 1) / 2];
        long long ans = X - 1;
        for (int i = 0; i < 100005; i++) {
    
    
            if (maxx[i] != -1 && minn[i] != 0x3f3f3f3f) {
    
    
                ans += maxx[i] - minn[i] + abs(mid - maxx[i]) + abs(mid - minn[i]);
            }
        }
        cout << ans << endl;
}

E - Rounding

题目链接
找近似值,由于要判断小数点后两位,刚开始要乘100,最后再转换回来。
由于四舍五入,所以最开始所求第一个数都减50,第二个数都加49。然后在第一个数的基础上加,如果最后第一个数大于第二个数,那么就不能调整,输出IMPOSSIBLE。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;

int n, sum, k = 10000;
int a[N], num[N][2];
char name[N][50];
int main()
{
    
    
    cin >> n;
    for(int i = 0; i < n; i ++)
    {
    
    
        cin >> name[i] >> a[i];
        a[i] *= 100;
        sum += a[i];
        num[i][0] = a[i] - 50;
        num[i][1] = a[i] + 49;
        if(a[i] == 0) num[i][0] = a[i];
        if(a[i] == k) num[i][1] = a[i];
    }
    for(int i = 0; i < n; i ++)
    {
    
    
        num[i][0] = max(num[i][0], a[i] + k - sum - (n - 1) * 49 );
        num[i][1] = min(num[i][1], a[i] + k - sum + (n - 1) * 50 );
        if(num[i][0] > num[i][1])
        {
    
    
            cout << "IMPOSSIBLE" << endl;
            return 0;
        }
    }
    for(int i = 0; i < n; i ++)
        printf("%s %.2f %.2f\n", name[i], num[i][0] * 1.0 / 100, num[i][1] * 1.0 / 100);

}

猜你喜欢

转载自blog.csdn.net/qq_47783181/article/details/112759873