Codeforces Round #481 (Div. 3)完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #481 (Div. 3)完结相关的知识,希望对你有一定的参考价值。
2022.3.1
题目地址:https://codeforces.com/contest/978
目录
- A. Remove Duplicates【模拟】
- B. File Name【贪心 / 双指针】
- C. Letters【前缀和+二分】
- D. Almost Arithmetic Progression【暴力枚举】
- E. Bus Video System【思维 贪心】
- F. Mentors【二分】
- G. Petya's Exams【贪心】
A. Remove Duplicates【模拟】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],st[N],n;
set<int>s;
vector<int>ve;
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i],s.insert(a[i]);
cout<<s.size()<<endl;
for(int i=n-1;i>=0;i--)
if(st[a[i]]) continue;
ve.push_back(a[i]);
st[a[i]]++;
for(int i=ve.size()-1;i>=0;i--) cout<<ve[i]<<" ";
return 0;
B. File Name【贪心 / 双指针】
计算出一段一段的xxx…,对于每一段计算最少的删除个数,累加即可。
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(void)
cin>>n>>s;
if(s.find("xxx")==-1) puts("0");
else
int cnt=0;
for(int i=0;i<s.size();i++)
if(s[i]=='x')
int j=i;
while(j+1<s.size()&&s[j+1]=='x') j++;
int len=j-i+1;
if(len>=3) cnt+=len-2;
i=j;
cout<<cnt;
return 0;
C. Letters【前缀和+二分】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL a[N],b[N],s[N],n,m;
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
for(int i=1;i<=m;i++)
cin>>b[i];
int index=lower_bound(s+1,s+n+1,b[i])-s;
cout<<index<<" "<<b[i]-s[index-1]<<endl;
return 0;
D. Almost Arithmetic Progression【暴力枚举】
不难但是细节挺多的,枚举前两项,即可确定公差。
然后判断即可,注意原数据和等差数列的数据的差值最多为1。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
int dx[3]=0,-1,1;
int a[N],n,ans=1e9;
void solve(int x,int sum,int d)
int b[N]=0;
b[1]=x;
for(int i=2;i<n;i++) b[i]=b[i-1]+d;//根据首相公差构造数组
for(int i=2;i<n;i++)
int len=abs(b[i]-a[i]);
if(len>1) return;//公差大于1
sum+=len;
if(sum<=n) ans=min(ans,sum);//步数小于等于n
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
if(n==1) puts("0");return 0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
int tempx=a[0]+dx[i];
int tempy=a[1]+dx[j];
int d=tempy-tempx;//公差
solve(tempy,abs(dx[i])+abs(dx[j]),d);//a[1] 步数 公差
if(ans<=n) cout<<ans;
else cout<<-1;
return 0;
E. Bus Video System【思维 贪心】
同过多次读题你会发现,求其前缀和就是各个站所对应的人数。
我们存一下,minv和maxv则显然问题就转化成了使这个图形向上平移。最多可以平移多少步可以使minv>=0且maxv<=m。
分为4种情况:
- minv>=0,maxv>=0
- minv>=0,maxv<=0(直接pass)
- minv<=0,maxv>=0
- minv<=0,maxv<=0
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
int main(void)
cin>>n>>m;
int minv=1e9,maxv=-1e9,sum=0;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
sum+=a[i];
maxv=max(maxv,sum);
minv=min(minv,sum);
if(minv<-m||maxv>m)
puts("0");
return 0;
if(minv>=0&&maxv>=0) cout<<m-maxv+1;
else if(minv<=0&&maxv>=0)
maxv+=abs(minv);
if(maxv>m) puts("0");
else cout<<min(m-abs(minv)+1,m-maxv+1);
else if(minv<=0&&maxv<=0)
maxv+=abs(minv);
if(maxv>m) puts("0");
else cout<<min(m-abs(minv)+1,m-maxv+1);
return 0;
F. Mentors【二分】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],b[N],cnt[N],n,m;
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
while(m--)
int s1,s2; cin>>s1>>s2;
if(a[s1]>a[s2]) cnt[s1]--;//将冲突的数量减去
if(a[s1]<a[s2]) cnt[s2]--;//将冲突的数量减去
for(int i=1;i<=n;i++)
int l=lower_bound(b+1,b+n+1,a[i])-b;//找到大于等于a[i]的下标
if(b[l]>=a[i]) l--;//减去
cnt[i]+=l;
cout<<cnt[i]<<" ";
return 0;
G. Petya’s Exams【贪心】
按先结束的排序,在按先开始的排序。
然后枚举天数,贪心的模拟即可。
需要注意的一点就是题目隐含的信息是,对于每门的考试考试日必须考试这也是符合常理的。
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],n,m,cnt,ans[N];
struct nodeint st,ed,c,k,id;Node[N];
bool cmp(node a,node b)
if(a.ed==b.ed) return a.st<b.st;
return a.ed<b.ed;
int main(void)
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>Node[i].st>>Node[i].ed>>Node[i].c,Node[i].id=i+1;
sort(Node,Node+m,cmp);
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
if((Node[j].c==Node[j].k)&&(i==Node[j].ed)) //准备的天数够了,且是考试日
ans[i]=m+1,cnt++;
break;
if(Node[j].k==Node[j].c) continue;//准备的天数够了但不是考试日。
if(Node[j].st<=i&&i<Node[j].ed)//在区间内
ans[i]=Node[j].id;
Node[j].k++;
break;
if(cnt==m)//考完了m门
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
else puts("-1");
return 0;
以上是关于Codeforces Round #481 (Div. 3)完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #481 (Div. 3)
Codeforces Round #481 (Div. 3) C. Letters
Codeforces Round #481 (Div. 3) F. Mentors
Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression