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