Codeforces Round 901 (Div. 2)

Dashboard - Codeforces Round 901 (Div. 2) - Codeforces

A. Jellyfish and Undertale

题意:有一个炸弹,给出初始爆炸时间b,可以进行n次操作,每次可以延长炸弹爆炸时间x[i],但最多不能延长超过a,如何操作可以最大程度延长炸弹爆炸时间

思路:因为炸弹的初始时间和每次操作的时间都是大于0的,每次都等炸弹为1的时候进行操作即可

AC code:

#include
#define endl '\n'
#define int long long
#define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;

typedef long long LL;
typedef pair PCI;
typedef pair PII;
const int N = 2e5+10, M = 1001;
const int INF = 0x3f3f3f3f, mod = 998244353;
int T, n, m;
int a, b, x[N];

int gcd(int a, int b){
	if(b) while((a %= b) && (b %= a));
	return a + b;
}

signed main(){
	fast();
	T = 1;
	cin >> T;
	while(T --){
		cin >> a >> b >> n;
		for(int i = 0; i < n; i ++)
		cin >> x[i];
		
		sort(x, x + n);
		int cnt = 0;
		for(int i = 0; i < n; i ++){
			if(b + x[i] > a) cnt += b - 1, b = min(x[i] + 1, a);
			else cnt ++, b += x[i] - 1;
			
			if(!b) break;
		}
		cout << b + cnt << endl;
	}
	return 0;
}

B. Jellyfish and Game

题意:J和G各自有n和m个苹果,每个苹果上有各自的数值代表价值,可以进行n轮游戏,第i轮时,若i为奇数,J可以选择交换自己任一苹果与G的任一苹果或者不交换,i为偶数时选择权给G,各自都会最佳博弈,求J最终可以得到的苹果最大价值总和

思路:

  • 分奇偶,回合数为奇数时J总能获得最大价值,否则G能获得最大价值;
  • 可以先以J的角度操作,交换自己的最小值与G的最大值
    • 若价值更小,则J第一轮不交换,第二轮G会交换自己的最小值与J的最大值
    • 否则,J和G的最大值都会在J手里,最小值都会在G手里,此时第二轮G会交换自己最小的与对方最大的
  • 从第三轮开始分奇偶,偶数时J改变不了什么,只有奇数时J可以交换自己最小的与对方最大的;

AC code:

#include
#define endl '\n'
#define int long long
#define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;

typedef long long LL;
typedef pair PCI;
typedef pair PII;
const int N = 2e5+10, M = 1001;
const int INF = 0x3f3f3f3f, mod = 998244353;
int T, n, m, k;
int a[N], b[N];

int gcd(int a, int b){
	if(b) while((a %= b) && (b %= a));
	return a + b;
}
signed main(){
	fast();
	T = 1;
	cin >> T;
	while(T --){
		cin >> n >> m >> k;
		int sum = 0, sum2 = 0;
		for(int i = 0; i < n; i ++)
		cin >> a[i], sum += a[i];
		for(int i = 0; i < m; i ++)
		cin >> b[i], sum2 += b[i];

		sort(a, a + n);
		sort(b, b + m);
		
		int ans = sum - a[0] + b[m - 1];
		if(ans < sum){
			ans = sum;
			ans = ans - a[n - 1] + b[0];
		}
		else{
			ans = ans - max(a[n - 1], b[m - 1]) + min(a[0], b[0]);
		}
		
		if(k % 2){
			int cnt = ans - min(a[0], b[0]) + max(a[n - 1], b[m - 1]);
			ans = max(ans, cnt);
		}
		cout << ans << endl;
	}
	return 0;
}

C. Jellyfish and Green Apple

题意:把n个苹果分给m个人,每次操作可以把一块苹果平分,问最少需要多少操作,否则输出-1

思路:先特判,当苹果可以直接平分时操作数为0,否则直接暴力跑,每轮先把能平分的平分完,剩下的苹果全部切半,操作数即剩下的苹果块数,跑循环即可

AC code:

#include
#define endl '\n'
#define int long long
#define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;

typedef long long LL;
typedef pair PCI;
typedef pair PII;
const int N = 2e5+10, M = 1001;
const int INF = 0x3f3f3f3f, mod = 998244353;
int T, n, m;
//int a[N], b[N];

int gcd(int a, int b){
	if(b) while((a %= b) && (b %= a));
	return a + b;
}

signed main(){
	fast();
	T = 1;
	cin >> T;
	while(T --){
		cin >> n >> m;
		if(n % m == 0) cout << 0 << endl;
		else{
			int cnt = 0;
			int flag = 0;
			for(int i = 0; i < 2e3; i ++){
				if(n > m) n = n % m;
				cnt += n;
				n *= 2;
				
				if(n % m == 0){
					flag = 1;
					break;
				}
			}
			if(flag) cout << cnt << endl;
			else cout << "-1" << endl;
		}
	}
	return 0;
}

/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| ^_^ |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑AC,永无bug缠身       
*/

你可能感兴趣的:(算法,c++)