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的矩形,对矩形的一些方格涂上蓝色,使得每个小矩形不能有相同的颜色相邻,只能是红蓝红蓝这样的。求解最小的蓝色涂色方案
题解:画图我们可以看到,1
3的涂法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;
}
posted @ 2021-11-14 23:03  Gsding  阅读(64)  评论(0)    收藏  举报