其他分享
首页 > 其他分享> > Dashboard - Codeforces Round #706 (Div. 2) - Codeforces

Dashboard - Codeforces Round #706 (Div. 2) - Codeforces

作者:互联网

Dashboard - Codeforces Round #706 (Div. 2) - Codeforces

1.Problem - A - Codeforces

题意:给定一个字符串何一个k,然后是否可以变成这种形式

$$
s=a{_1}+a{_2}+.......+a{_k}+a{_{k+1}}+R(a{_{k-1}})+......+R(a{_{1}})
$$

R代表对字符串reverse.

思路:中间字符串可以是任意长度,所以考虑其他字符串长度都是1.然后从左和从右开始匹配,看是否存在可以匹配上k组,同时中间长度不为0.

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
string s;
int n,k;
//发现一个问题中间那一段是可以不回文得,只要边缘能形成k对字符并且两个指针还没碰到一起即可
void slove(){
cin>>n>>k;
cin>>s;
if(k==0){
cout<<"YES"<<endl;
return;
}
int cnt=0;
for(int i=0;i<(n+1)/2-1;i++){//中间字符不可为空
if(s[i]==s[n-i-1]){
cnt++;
}
else{
break;
}
}
if(cnt>=k){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
signed main()
{
IOS
   int t;
   cin>>t;
   while(t--) {
       slove();
  }
   return 0;
}

 

2.Problem - B - Codeforces

题意:就是存在一个多重集合s,然后每次可以把mex(s)和max(s)的和除以2向上取整放入集合问最后集合中的不同元素个数。

思路:首先考虑这种情况0,1,2,3,4。那下一次加入的值就是(5+4)/2上取整就是5,所以这种数列每次都会添加一个新值。这样答案就是s,size()+k

第二种情况就是mex(s)是小于集合中的最大值的。如果添加的数是集合中原来不存在的数那是有可能更行mex(s)的值的。比如0 , 2,就会添加1.

但是如果你添加的值是原来集合中有的,那mex和max都不会更新了。那每次添加的值就是相同的了。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
int n,k;
set<int>s;
map<int,int>mp;
void slove(){
cin>>n>>k;
int mx=-1;
mp.clear();
s.clear();
for(int i=1,x;i<=n;i++){
cin>>x;
mp[x]=1;
s.insert(x);
mx=max(x,mx);
}
int cnt=0;
for(int i=0;i<=mx;i++){
if(mp[i]){
cnt++;
}
else break;
}
if(cnt==mx+1){
cout<<mx+1+k<<endl;
return;
}
for(int i=1;i<=k;i++){
int t1=0;
for(int j=0;j<=mx;j++){
if(mp[j]==0){
t1=j;
break;
}
}
t1=ceil(1.0*(t1+mx)/2);
if(s.find(t1)!=s.end()){
break;
}
else{
s.insert(t1);
}
}
cout<<s.size()<<endl;
}
signed main()
{
IOS
   int t;
   cin>>t;
   while(t--) {
       slove();
  }
   return 0;
}

 

3.Problem - C - Codeforces

c题比a,b还简单?

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
const int N=1e5+100;
int n;
double x[N],y[N];
bool cmp(double a,double b){
return abs(a)<abs(b);
}
void slove(){
cin>>n;
int cntx=0,cnty=0;
for(int i=1;i<=2*n;i++){
int op,w;
cin>>op>>w;
if(op==0){
y[++cnty]=1.0*w;
}
else{
x[++cntx]=1.0*op;
}
}
sort(y+1,y+1+n,cmp);
sort(x+1,x+1+n,cmp);
double ans=0;
for(int i=1;i<=n;i++){
ans+=sqrt(x[i]*x[i]+y[i]*y[i]);
}
printf("%.10llf\n",ans);
}
signed main()
{
IOS
   int t;
   cin>>t;
   while(t--) {
       slove();
  }
   return 0;
}

 

4.Problem - D - Codeforces

基本参考洛谷本题的最优题解。

CF1495B Let's Go Hiking - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
#define int long long
//洛谷的第二篇题解确实思维不错
//就是通过分析到最后只有两条最长的边连在一起并且是奇数边青山才有可能赢
const int N=1e5+100;
int n,a[N],dp1[N],dp2[N],up,down,ml;
signed main()
{
IOS
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>a[i-1]) dp1[i]=dp1[i-1]+1;
else dp1[i]=1;
if(a[i]<a[i-1]) dp2[i]=dp2[i-1]+1;
else dp2[i]=1;
up=max(up,dp1[i]);
down=max(down,dp2[i]);//记录最长下坡的长度
}
//cout<<up<<down<<endl;
ml=max(up,down);
int flag1=0,flag2=0,pos1=0,pos2=0,cnt=0;
for(int i=1;i<=n;i++){
if(dp1[i]==ml){
flag1=1;
cnt++;
pos1=i;
}
if(dp2[i]==ml){
flag2=1;
cnt++;
pos2=i;
}
}
//cout<<pos1<<pos2<<endl;
if(flag1&&flag2&&cnt==2&&pos1==pos2-ml+1&&ml%2){//pos2记录的是下坡的坡长最大值位置
cout<<1<<endl;
}
else{
cout<<0<<endl;
}
   return 0;
}
 

标签:cnt,cout,int,706,cin,long,Codeforces,Div,define
来源: https://www.cnblogs.com/silky----player/p/16556931.html