Codeforces Round #555 Div. 3
Posted fengxunling
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #555 Div. 3相关的知识,希望对你有一定的参考价值。
题目链接:戳我
完了,最菜就是我了。div.3都写不动QAQ
A
按照题意模拟即可,注意判重
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define MAXN 100010
using namespace std;
int n;
vector<int>v;
map<int,int>m;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
while(n)
{
if(m.count(n)==0)v.push_back(n);
else break;
m[n]=1;
n+=1;
while(n%10==0) n/=10;
}
printf("%d\n",v.size());
return 0;
}
B
开始看错题了嘤嘤嘤,注意是连续的一段
直接贪心就行了吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define MAXN 300010
using namespace std;
int n,kkk;
int a[MAXN],to[MAXN];
bool flag=false;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%1d",&a[i]);
for(int i=1;i<=9;i++) scanf("%d",&to[i]);
for(int i=1;i<=n;i++)
{
if(to[a[i]]>a[i]&&flag==false)
{
kkk=a[i];
a[i]=to[a[i]];
flag=true;
for(int j=i+1;j<=n;j++)
{
if(to[a[j]]>=a[j]) a[j]=to[a[j]];
else break;
}
break;
}
}
for(int i=1;i<=n;i++) printf("%d",a[i]);
return 0;
}
C1
因为数都不一样,所以枚举数就行了,看看每次要拿走哪边的qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define MAXN 300010
using namespace std;
int n,kkk,maxx=-0x3f3f3f3f,ans;
int a[MAXN],to[MAXN];
bool flag=false;
vector<char>vec;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=1,r=n;
for(int i=1;i<=n;i++)
{
if(a[l]==i) vec.push_back('L'),l++,ans++;
else if(a[r]==i) vec.push_back('R'),r--,ans++;
}
cout<<ans<<endl;
for(int i=0;i<vec.size();i++) cout<<vec[i];
cout<<endl;
return 0;
}
C2
和上一个题唯一不一样的就是这里的值可能不相等。
注意当两边相等的时候,需要求一下两边各能延展多远,找能取数最多的一边取qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define MAXN 300010
using namespace std;
int n,kkk,maxx=1,ans;
int a[MAXN],to[MAXN];
bool flag=false;
vector<char>vec;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=1,r=n;
while(maxx<=200000)
{
if(l>r||(a[l]<maxx&&a[r]<maxx)) break;
if(l==r&&a[l]==maxx)
{
if(a[l]==maxx) vec.push_back('L'),l++,ans++;
else break;
}
else if(a[l]==maxx&&a[r]==maxx)
{
int cnt1=0,cnt2=0;
for(int j=l+1;j<=r;j++)
{
if(a[j]>a[j-1]) cnt1++;
else break;
}
for(int j=r-1;j>=l;j--)
{
if(a[j]>a[j+1]) cnt2++;
else break;
}
if(cnt1>cnt2)
{
maxx=a[l+cnt1]+1;
for(int j=0;j<=cnt1;j++)
vec.push_back('L'),l++,ans++;
}
else
{
maxx=a[r-cnt2]+1;
for(int j=0;j<=cnt2;j++)
vec.push_back('R'),r--,ans++;
}
continue;
}
else if(a[l]==maxx) vec.push_back('L'),l++,ans++;
else if(a[r]==maxx) vec.push_back('R'),r--,ans++;
maxx++;
}
printf("%d\n",ans);
for(int i=0;i<vec.size();i++) printf("%c",vec[i]);
return 0;
}
D
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 200010
using namespace std;
int n,k,nn;
int a[MAXN];
inline bool check()
{
long long cur_ans=a[1];
for(int i=2;i<=k;i++)
{
if(a[i]<=a[i-1]) {return false;}
if(a[i]>a[i]*2) {return false;}
cur_ans+=a[i];
}
if(cur_ans!=1ll*nn) return false;
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&k);
nn=n;
for(int i=1;i<=k;i++)
{
a[i]=max(a[i-1]+1,(int)ceil((double)n/(pow(2.0,k-i+1)-1)));
n-=a[i];
}
if(check()==false) printf("NO\n");
else
{
printf("YES\n");
for(int i=1;i<=k;i++) printf("%d ",a[i]);
}
return 0;
}
E
给你两个序列,要求对B进行重排,使得之后\((A[i]+B[i])\mod n\)生成的C序列字典序最小。
直接贪心地找B序列中有没有\(n-A[i]\)的数,或者离这个数最近的数就行了嘛。
上一个multiset+lower_bound即可,如果迭代器到了最末尾,让它返回.begin()
不过需要注意一点.....set的lower_bound需要这样写
multiset<int>::iterator it=s.lower_bound(k);
而不是
multiset<int>::iterator it=lower_bound(s.begin(),s.end(),k);
第二种写法会T......谁知道到底是为什么qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#define MAXN 200010
using namespace std;
int n;
int a[MAXN],b[MAXN],c[MAXN];
multiset<int>s;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]),s.insert(b[i]);
// for(multiset<int>::iterator it=s.begin();it!=s.end();it++) cout<<(*it)<<" "; cout<<endl;
for(int i=1;i<=n;i++)
{
// printf("i=%d\n",i);
multiset<int>::iterator cur=s.lower_bound(n-a[i]);
if(cur==s.end()) cur=s.begin();
// cout<<(*cur1)<<" "<<(*cur2)<<endl;
c[i]=((*cur)+a[i])%n;
s.erase(cur);
}
for(int i=1;i<=n;i++) printf("%d ",c[i]);
return 0;
}
F
G
不太会,先咕着。
以上是关于Codeforces Round #555 Div. 3的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #555 (Div. 3)[1157]题解
E Minimum Array ( Codeforces Round #555 (Div. 3) )
codeforces 555b//Case of Fugitive// Codeforces Round #310(Div. 1)
Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)