欢迎来到清街老酒的博客

どんな別れがあったとしても、出会ったことには必ず意味がある

Educational Codeforces Round 97 (Rated for Div. 2)

Educational Codeforces Round 97 (Rated for Div. 2)

A.Marketing Scheme

题意:是否存在a使在[l,r]之间所有的数(用x表示)都满足,\((x mod a)\geq\frac{a}{2}\)
思路:2*l>r那么a=r+1一定满足

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
using namespace std;
int n,t; 
int main()
{
	int l,r;
	cin>>t;
	while(t--)
	{
		cin>>l>>r;
		if(l*2>r)
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
}

B.Reverse Binary Strings

题意:给一个二进制字符串,翻转其中一部分视为一次操作,问最少的操作次数使字符串变为0,1交错。
思路:翻转字符串不改变翻转部分内部的0,1相邻关系,只改变头和尾部分并且是交换关系,所以只要每当找到一个相邻相同的字符当作头,便往后找第一个相邻相同的字符且与头不为同一字符作为尾,翻转头尾之间的部分。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
using namespace std;
int n,t; 
string s;
void op(int p,char c)
{
    bool flag=false;
    for(int i=p;i<n-1;i++)
    {
        if(s[i]==s[i+1]&&flag&&s[i]!=c)
        {
            reverse(s.begin()+p,s.begin()+i+1);
            return;
        }
        if(s[i]!=s[i+1])
        {
            flag=true;
        }
    }
}
int main()
{
	cin>>t;
	while(t--)
	{
		ll ans=0;
		cin>>n>>s;
		for(int i=0;i<n;i++)
		{
			if(s[i]==s[i+1])
			{
				op(i+1,s[i]);
				ans++;
			}
		}
		cout<<ans<<endl;
	}
}

C.Chef Monocarp

题意:每到菜最佳出菜时间为T[i],但一个时间只能出一道菜,问如何使所有(T[i]-t)的和最小
思路:dp,先排序,设dp[i][j]为第i到菜第j分钟出菜使的花费。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
using namespace std;
int n,t,a[205],f[205][10005]; 
int main()
{
	cin>>t;
	while(t--)
	{
		int mmax=INF;
		cin>>n;
		for(int i=1;i<=n;i++)
		cin>>a[i];
		sort(a+1,a+1+n);
		for(int j=1;j<=4*n;j++)
		f[1][j]=abs(a[1]-j);
		for(int i=2;i<=n;i++)
		for(int j=1;j<=4*n;j++)
		f[i][j]=INF;
		for(int i=2;i<=n;i++)
		for(int j=1;j<=4*n;j++)
		for(int k=1;k<j;k++)
		f[i][j]=min(f[i][j],f[i-1][k]+abs(a[i]-j));
		for(int i=1;i<=4*n;i++)
		{
			mmax=min(f[n][i],mmax);
		}
		cout<<mmax<<endl;
	}
}

D.Minimal Height Tree

题意:给一个bfs顺序遍历的节点顺序,且每一个父节点的子节点都是从小到大的顺序遍历,问树的可能的最小深度。
思路:贪心,把从小到大的一个序列放进同一个父节点,然后每层父节点放满,再放下一层。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
using namespace std;
int t,n,a[200005]; 
vector<int> q;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		q.clear();
		ll len=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		for(int i=2;i<=n;i++)
		{
			if(a[i]>a[i-1])
			len++;
			else
			{
				q.push_back(len);
				len=1; 
			}
		}
		q.push_back(len);
		ll ans=0;
		ll mmax=1;
		ll num=0;
		ll nmax=0;
		ll x=0;
		while(x<q.size())
        {
            num++;
            if(num>mmax)
            {
                mmax=nmax;
                nmax=q[x];
                num=1;
                ans++;
            }
            else nmax+=q[x];
            x++;
        } 
        cout<<ans+1<<endl;
	}
}
posted @ 2020-10-29 14:26  清街老酒  阅读(198)  评论(0编辑  收藏  举报