Codeforces Beta Round #49 (Div. 2) A-D

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Beta Round #49 (Div. 2) A-D相关的知识,希望对你有一定的参考价值。

  • 博客主页: https://blog.csdn.net/qq_50285142
  • 欢迎点赞👍收藏✨关注❤留言 📝 如有错误,敬请指正
  • 🎈虽然生活很难,但我们也要一直走下去🎈

A. Autocomplete

题意:
给一个标准的字符串,然后给出n个字符串,问这n个字符串中前缀能和标准的字符串能够匹配上的最小字典序的那个字符串

思路:

  1. 首先是匹配字符串前缀,需要一个一个字符比较,匹配不上就结果就为假
  2. 然后就是找最小字典序的字符串,我们构造一个字典序最大的字符串(“zzzzzzzz”)很多z,然后把能匹配上的逐一比较即可
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 2e5+5,M = 2e5+5;

int n,m,k;

void solve()
{
	string s,p(105,'z');
	cin>>s>>n;
	bool f = false;
	for(int i=1;i<=n;i++)
	{
		string a;
		cin>>a;
		bool is = true;
		for(int i=0;i<s.size();i++)
			if(a[i]!=s[i])
				is = false;
		if(is and a<p) p = a,f = true;
	}
	if(f) cout<<p<<"\\n";
	else cout<<s<<"\\n";
}
int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0),cout.tie(0);
	int _;
//	cin>>_;
	_ = 1; 
	while(_--)
	{
		solve();
	}
	return 0;
}
 

B. Blog Photo

题意:
一个 h ∗ w h*w hw的矩形纸片,要剪出一个矩形满足 0.8 ≤ h / w ≤ 1.25 0.8 \\leq h/w \\leq 1.25 0.8h/w1.25,并且有一个数为2的次幂,优先选择最大h的,要求剪出来的面积最大,求剪出来的hw为多少

思路:
4 5 ≤ h w ≤ 5 4 \\frac{4}{5} \\leq\\frac {h}{w} \\leq \\frac{5}{4} 54wh45
可得: h ≤ 1.25 w , w ≤ 1.25 h h \\leq 1.25w,w \\leq 1.25h h1.25w,w1.25h
应为必须有一个数要为2的幂次,我们构造这样的数,找最大的为k,然后我们求出hw的最大值hhww
k是我们要变成的一个2次幂的数,
如果hh大于ww的话,那么就是选择hh的面积更大,故高为hh,宽为k
反之高为k,宽为ww

#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 2e5+5,M = 2e5+5;

int n,m,k;

void solve()
{
	int h,w;
	cin>>h>>w;
	k = 1;
	while(k*2 <= h and k*2<=w) k *= 2;
	int hh = min(h,(int)(1.25*k));
	int ww = min(w,(int)(1.25*k));
	if(hh>=ww) cout<<hh<<" "<<k<<'\\n';
	else cout<<k<<" "<<ww<<'\\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int _;
//	cin>>_;
	_ = 1; 
	while(_--)
	{
		solve();
	}
	return 0;
}
 

C.Little Frog

题意:
n个土堆之间的间隔都为1,一个青蛙想要前后两次跳的距离都不一样,求跳的顺序

思路:
每次选一个最小数一个最大数就行
比如6个土堆时
那么就是1 6 2 5 3 4

#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 2e5+5,M = 2e5+5;

int n,m,k;

void solve()
{
	cin>>n;
	int l=1,r=n;
	for(int i=1;i<=n/2;i++)
	{
		cout<<l++<<" "<<r--<<" ";
	 } 
	 if(n&1) cout<<l;
	 cout<<'\\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int _;
//	cin>>_;
	_ = 1;
	while(_--)
	{
		solve();
	}
	return 0;
}
 

D. Physical Education

题意:
求让第一个序列变为第二个序列所需要交换数的次序

思路:
n ≤ 300 n \\leq 300 n300可以直接暴力
循环a数组,从b数组中找与当前a数组位置的数相同的数,然后把它从后往前交换就行,交换的过程中记录结果

#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 1e5+5,M = 2e5+5;

int n,m,k;
int a[305],b[305];
pii res[N];

void solve()
{
	int cnt = 0;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++)
	{
		if(a[i]==b[i]) continue;
		for(int j=i+1;j<=n;j++)
		{
			if(a[i]==b[j])
			{
				for(int k=j;k>=i+1;k--)
				{
					res[++cnt]={k-1,k};
					swap(b[k-1],b[k]);
				}
				break;
			}
		}
	}
	cout<<cnt<<"\\n";
	for(int i=1;i<=cnt;i++)
		cout<<res[i].fi<<" "<<res[i].se<<"\\n";
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int _;
//	cin>>_;
	_ = 1; 
	while(_--)
	{
		solve();
	}
	return 0;
}
 

往期优质文章推荐

以上是关于Codeforces Beta Round #49 (Div. 2) A-D的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Beta Round#2

Codeforces Beta Round #7

Codeforces Beta Round #6 (Div. 2)未完结

Codeforces Beta Round #5

Codeforces Beta Round #3

Codeforces Beta Round #29 (Div. 2, Codeforces format)