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

Educational Codeforces Round 86 (Rated for Div. 2) 总结

程序员文章站 2022-05-12 12:25:01
...

Educational Codeforces Round 86 (Rated for Div. 2) 总结

一 . A. Road To Zero

Educational Codeforces Round 86 (Rated for Div. 2) 总结Educational Codeforces Round 86 (Rated for Div. 2) 总结``

题意:对于两个数x,y有两种操作,第一种花费代价为a使得x,y其中一个增一或者减一,第二种花费代价为b,使得x,y同时增一或者减一。
我的想法:读过好几遍之后,发现x,y是在0到10^9之间的正数,那么x,y一定是同号的,那么就只有两种计算方法,第一种是不管三七二十一直接每一个都减一,计算总的花费,第二种就是把两个数较大的多出来的部分单独减一,两个数相等的部分同时减一,最后计算总的花费,两种情况取最小。于是就有了我的代码,一直被卡倒腾了一个多小时还是不对。然后结束之后我去参考了同学的代码,发现她比我多了 一步操作就是考虑了x,y异号的情况,她的通过了。但是x,y怎么会异号呢????,我也很奇怪,不太明白。
//我的错误代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
	int t,x,y,a,b;
	cin >> t;
	while(t--)
	{
		long long ans1 = 0;
		long long ans2; 
		cin >> x >> y;
		cin >> a >> b;
		if(a==0&&y==0)
			cout << "0" << endl;
		else
		{
			ans1 += min(x,y) * b;
			ans1 += (max(x,y) - min(x,y)) * a;
			ans2 = (x+y) * a;
			cout << min(ans1,ans2) << endl;
		}
	}
	return 0;
}
//大佬代码(真的很简洁)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() 
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int t; 
	cin >> t;
	while (t--)
	{
		ll x, y, a, b;
		cin >> x >> y >> a >> b;
		b = min(a + a, b);
		cout << min(x, y) * b + (max(x, y) - min(x, y)) * a << "\n";
	}
}
//同学的正确代码
while (t--)
	{
		cin >> x >> y;
		cin >> a >> b;
		if (x == 0 && y == 0)
		{
			cout << '0' << endl;
			continue;
		}
		else
		{
			ll m = max(x, y);
			ll n = min(x, y);
			ll u = m - n;
			ll ans;
			if (x * y >= 0)
				ans = min((x + y) * a, n * b + u * a);
			else
				ans = min(n * b + (m + n) * a, u * a);
			cout << ans << endl;
		}
	}

二. B. Binary Period

Educational Codeforces Round 86 (Rated for Div. 2) 总结
Educational Codeforces Round 86 (Rated for Div. 2) 总结

题意:给出一个字符串,让你求另一个字符串,并且该字符串满足1.全部由01组成;2.长度不超过给定字符串的2倍;3.给定字符串是所求字符串的字串;4.周期尽可能小;
我的想法:所给的字符串有两种情况,第一全部由相同的字符组成,第二有不同的字符组成。如果组成字符相同那么那么周期直接最小就是1;如果不相同那么最小周期就是2;01间隔;然而想的非常好但是还是没做出来,当时一直以为是代码写错了,然后一直在差代码的错结果最后时间到了还是没弄出来,比赛完成之后回头再看发现他要求的字符长度是1到100;那么所求的就是1到200;我本来是想定义一个220的数组,结果写成了22;然后一直没看见,真是活该出错。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 22;//220 这该死的22
int t;
char s[N];
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> s;
		int len = strlen(s);
		int cnt = 0;
		for(int i = 0; i < len; i++)
			cnt += (s[i]-'0');
		if((cnt==0)||(cnt==len))
		{
			cout << s << endl;
			continue;
		}
		for(int i = 0; i < len-1; i++)
		{
			if(s[i]==s[i+1]&&s[i]=='1')
				cout << s[i] << "0"; 
			else if(s[i]==s[i+1]&&s[i]=='0')
				cout << s[i] << "1"; 
			else
				cout << s[i]; 
		}
		cout << s[len-1] << endl;
	}
	return 0;
}
//大佬的代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() 
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int t; 
	cin >> t;
	while (t--) 
	{
		string s;
		cin >> s;
		int zero = 0, one = 0;
		for (auto i : s) 
		{
			if (i == '1') 
				one++;
			else 
				zero++;
		}
		if (!zero || !one) 
			cout << s << '\n';
		else 
		{
			int n = s.length();
			while (n--) 
				cout << "10";
			cout << '\n';
		}
	}
}