Codeforces Round #755 (Div. 2)
反思:凭空想象,啥也不是,A题写错公式wa了一发,C题wa了好几发总算看懂了,结果被hack了吐了,又被扣分了www
A. Mathematical Addition
传送门
题意:

求解这个公式的x,y
题解:化简结果就是

code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int main(){
int n, t;
cin >> t;
while (t --){
ll u, v;
cin >> u >> v;
ll sum = u + v;
ll num = u * v;
ll x = -1*(u*u);
ll y = v*v;
cout << x << " " << y << endl;
}
return 0;
}
/*
s = u + v, n = uv;
(xv + uy)s = (x+y)n
vs - n * x + us - n * y = 0;
(vx+uy)sum = (x+y)num
ax + by = 0;
v*(v+u) -vu
*/
B. Coloring Rectangles
传送门
题意:给一个全红色的矩形。我们可以任意切分这个矩形,但不能切成11的矩形,对矩形的一些方格涂上蓝色,使得每个小矩形不能有相同的颜色相邻,只能是红蓝红蓝这样的。求解最小的蓝色涂色方案
题解:画图我们可以看到,13的涂法3个格子制图一个蓝色,是最优解,其次是21的格子涂一个蓝色,我们找出矩形的长为a,a除以3得到倍数再乘以宽b,就是13的最优解。剩余的a%3 , a等于1和2两种情况,就纵向分解成1*3的情况,注意宽b取余3剩余的方格要特判一下
code:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 1e5 + 10;
int main(){
int n, m;
int t;
cin >> t;
while (t --){
cin >> n >> m;
int b1,b2,sum2,sum3;
int a = max(n,m);
int b = min(n,m);
int a1 = a/3;
int sum1;
a %= 3;
if (a == 1){
sum1 = b*a1;
b1 = b/3;
sum2 = b1;
b%=3;
if (b) sum2++;
cout << sum1 + sum2 << endl;
}
else if(a == 2){
sum1 = b*a1;
b2 = b/3;
sum3 = b2 * 2;
b %= 3;
if(b == 2) sum3 += 2;
else if (b == 1) sum3 ++;
cout << sum1 + sum3 << endl;
}
else {
sum1 = b *a1;
if (!a) cout << sum1 << endl;
else if (a == 1) cout << sum1 + 1 << endl;
else cout << sum1 + 2 << endl;
}
}
return 0;
}
C. Two Arrays
传送门
被hack原因:bi - ai 加了个abs,急了吧当时没考虑到bi 必然 大于等于ai,比赛过程中直接被hack,比赛后也是掉分了
题意:问数组a经过k次操作,使得a1 到ak 都加1,能让数组a经过某种排序得到数组b
题解:明明比B还要简单就是硬wa,若想经过一系列加一得到b数组,也就是经过操作后a的最大值必然要小于等于b的最大值的,也就是说,原始的a和b排序后对应项一定是b大的,那么要经过加1操作,就是bi- ai <= 1
code:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N],b[N];
int main(){
int n, t;
cin >> t;
while (t --){
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= n; i ++)
cin >> b[i];
sort(b+1,b+1+n);
sort(a+1,a+1+n);
int ans = 1;
for(int i = 1; i <= n; i ++){
if (b[i] - a[i] > 1 || b[i] - a[i] < 0){
ans = 0;
break;
}
}
if (ans) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}

浙公网安备 33010602011771号