欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Codeforces Round #638 (Div. 2)总结

程序员文章站 2022-05-12 12:22:24
...

Codeforces Round #638 (Div. 2)总结

当时做这一场比赛的时候还是很烦人的,做完第一个,开始做第二个,看题看了还没十分钟就停电了,很难受,刚刚补了第二个题感觉血亏,哎。

一. Phoenix and Balance

Codeforces Round #638 (Div. 2)总结

题意:有n枚硬币(n是偶数),质量分别为从2到2的n次方的整数。现在想要将硬币分成两堆,使得两堆质量总和的差的绝对值尽量小,问这个差值最小是多少。
我的方法:当时做的时候像暴力硬算最后发现实现过程有点麻烦,然后就打了个表找了找规律,所求结果的值是以2为公比的等比数列前n项和,然后只需要找到所输入的n是按照2,4,6,8……第几个输进去的就直接算出来了。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 33;
int t,n;
int num[N];
int vis[N];
int main()
{
	num[1] = 2;
	vis[1] = 2;
	for(int i = 2; i <= 31; i++)
		num[i] = num[i-1] * 2;
	for(int i = 2; i <= 20; i++)
		vis[i] = vis[i-1] + 2;
	cin >> t;
	while(t--)
	{
		cin >> n;
		for(int i = 1; i <= 31 ;i++)
		{
			if(vis[i]==n)
			{
				cout << 2*(num[i]-1) << endl;
				break;
			}
		}
	}
	return 0;
}

二. Phoenix and Beauty

Codeforces Round #638 (Div. 2)总结
Codeforces Round #638 (Div. 2)总结

题意:给定一个长度为n的数组和一个整数k,漂亮数组就是该数组的任意长度为k的连续子序列值的和都相等,你可以插入从1到n之间的数,使数组变得漂亮,现在给一个数组(可能是漂亮的)让你构造一个新的漂亮数组,如果无法构造就输出-1。
我的想法:如果一个数组满足漂亮数组的条件,那么数组里面数的种类肯定小于k,不然就弄不出来,而且满足a1到ak的和等于a2到ak+1的和,那么等式两边相等化简一下就是a1=ak+1;那这样我们就可以一直循环a1到ak,她说不用最小化m,那长度看自己心情了。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 1e4+10;
int n,k,t;
int a[N],num[N],vis[110];
int main()
{
	cin >> t;
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		cin >> n >> k;
		int cnt = 0;
		for(int i = 1; i <= n; i++)
		{
			cin >> a[i];
			if(vis[a[i]]==0)
			{
				vis[a[i]] = 1;
				num[++cnt] = a[i];
			}
		}
		if(cnt>k)	
			cout << -1;
		else
		{
			for(int i = cnt+1; i<=k; i++)	
				num[i] = num[i-1];
			for(int i = k+1; i <= 9999; i++)//我补题的时候循环的次数太小了,然后一直错,最后直接9999 
				num[i] = num[i-k];
			cout << 9999 << endl;
			for(int i = 1; i <= 9999; i++)	
				cout << num[i] << " ";
		}
		cout << endl;
	}
}