ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-06 13:30:49  阅读:139  来源: 互联网

标签:cnt cout int 706 cin long Codeforces Div define


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有