Educational Codeforces Round 97 (Rated for Div. 2) (已自闭)
我好菜啊。。
明明感觉都很简单,为什么当时没想出来呢?
A. Marketing Scheme
题意:给出一段从L到R的区间,能否找出一个x数,使得区间任意的一个数mod x>=x/2.
一个数能取模最大的就是其本身,所以让一个数 a mod x 最大,应该让 x>a 说以我们让x取r+1,即L到R区间所有数都为其本身
如果让区间内任意一个数a mod x>=x/2,即判断区间内最小的数L mod x>=x/2
#include <iostream> using namespace std; int t,l,r; int main(){ cin>>t; while(t--){ cin>>l>>r; if((r+1)/2.0<=l){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } }
B. Reverse Binary Strings
题意,由偶数个数量相等0和1组成的字符串,反向其中任意字串,问最少反向几次能得到010101...或101010...这样的字符串
统计字符串中字串01的个数,和10的个数,从中取max,即字符串中不需反向的个数,用其(总串-不需反向的个数)/2即可
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
int t,n;
string s;
int main(){
cin>>t;
while(t--){
cin>>n;
cin>>s;
int cnt1=0,cnt2=0,ans=0;
for(int i=0;i+1<s.size();i++){
if(s[i]=='1'&&s[i+1]=='0'){
cnt1++;
}
if(s[i]=='0'&&s[i+1]=='1'){
cnt2++;
}
}
ans=max(cnt1,cnt2);
cout<<(n-ans*2)/2<<endl;
}
}
C. Chef Monocarp
首先给上菜时间排个序,暴力每个时间节点选择是选择取菜还是不取菜,最后加上记忆化搜索
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
int t,n;
int a[1000],dp[1000][1000];
int dfs(int tim,int cur){
if(cur==n+1){
return 0;
}
if(tim==500){
return 1e9;
}
if(dp[tim][cur]!=-1) return dp[tim][cur];
int ans=1e9;
ans=min(ans,dfs(tim+1,cur+1)+abs(tim-a[cur]));
ans=min(ans,dfs(tim+1,cur));
//cout<<"ans="<<ans<<" "<<abs(tim-a[cur])<<endl;
return dp[tim][cur]=ans;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=0;i<=600;i++){
for(int j=0;j<=n;j++){
dp[i][j]=-1;
}
}
sort(a+1,a+1+n);
cout<<dfs(1,1)<<endl;
}
}
D. Minimal Height Tree
模拟上层有多少节点,再统计这层有多少节点,递增的节点对上层能放一个节点上,当上层节点数用完,就将本层的节点数当上层,ans++,继续统计下层。
#include <iostream>
using namespace std;
const int N=2e5+7;
int t,n,a[N];
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[n+1]=-1;
int cnt=0,now=1,ans=0;
for(int i=2;i<=n;i++){
cnt++;
if(a[i]<a[i+1]){
}else{
now--;
}
if(i==n&&now!=0){
ans++;
}
if(now==0){
ans++;
now=cnt;
cnt=0;
}
}
cout<<ans<<endl;
}
}

浙公网安备 33010602011771号