Educational Codeforces Round 97 (Rated for Div. 2)
A.Marketing Scheme
题意:是否存在a使在[l,r]之间所有的数(用x表示)都满足,((x mod a)geqfrac{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;
}
}