codeforces补题
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces补题相关的知识,希望对你有一定的参考价值。
Codeforces 982补题
这场有点惨啊。。。。。。。开场两道签到全挂,一道读错题意,一道数组大小开错,要开两倍!
a题:
题意如下:给出一个长度为n的一排座位,1代表有人座,0代表没有人座,1:一个人旁边不能有另外的人,2:如果再也不能加入另外的人,那么这个座位便是符合要求的。
翻译出来的话就是(不能有两个1同时在一起这就满足条件一,(然后不能加入另外的人的话便是不能有3个0同时存在)或者是(刚开始的两位为0)或者是(结束的两位为0)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1010; 4 int n; 5 char sz[maxn]; 6 int main(){ 7 scanf("%d",&n); 8 scanf("%s",sz+1); 9 for(int i=1;i<n;i++){//第一种情况 10 if(sz[i]==‘1‘&&sz[i+1]==‘1‘){ 11 printf("No "); 12 return 0; 13 } 14 } 15 for(int i=1;i<=n;i++){//第二种情况 16 if(sz[i]==‘0‘&&(i==1||sz[i-1]==‘0‘)&&(i==n||sz[i+1]==‘0‘)){//也是核心语句 17 printf("No "); 18 return 0; 19 } 20 } 21 printf("Yes "); 22 return 0; 23 }
b题:
b题我的主要原因还是在开始的时候贪快了,没有注意到字符串数组要开两倍的位置
b题思路就是先排一遍序,从小到大,这样就可以保证每次进队列的时候可以按照从小到大的顺序,
然后出来的话用个优先队列就可以了,从大到小依次输出
1 #include<bits/stdc++.h> 2 #include<queue> 3 using namespace std; 4 const int maxn=2e5+1000; 5 int n; 6 struct node{ 7 long long id,w; 8 }; 9 node num[maxn]; 10 char sz[maxn<<1];//b题错在了sz没有开两倍 11 bool cmp(node n1,node n2){ 12 return n1.w<n2.w; 13 } 14 bool operator <(node n1,node n2){ 15 return n1.w<n2.w; 16 } 17 18 priority_queue<node> q; 19 int main(){ 20 while(scanf("%d",&n)!=EOF){ 21 for(int i=1;i<=n;i++){ 22 scanf("%lld",&num[i].w); 23 num[i].id=i; 24 } 25 scanf("%s",sz+1); 26 sort(num+1,num+n+1,cmp); 27 28 int jin=0; 29 for(int i=1;i<=2*n;i++){ 30 if(sz[i]==‘0‘){ 31 jin++; 32 printf("%d ",num[jin].id); 33 q.push(num[jin]); 34 }else{ 35 //chu++; 36 //printf("%d ",num[jin-chu+1].id); 37 node n1=q.top();q.pop(); 38 printf("%d ",n1.id); 39 } 40 } 41 } 42 return 0; 43 }
优先队列的用法:
首先明确队列默认由大到小,由小到大可以为 priority_queue<int,vector<int>,greater<int> > q;
优先队列的符号是 < 重载时肯定也只能 重载 < 可以尝试 > .....会报错哒;
c题:
首先发一个链式前向星的链接:https://blog.csdn.net/Binary_Heap/article/details/78209086
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+100; 4 int head[maxn]; 5 int num[maxn]; 6 7 struct edge{ 8 int to,next; 9 }; 10 11 edge es[maxn<<1]; //边忘记开两倍,re了一次 12 int n,cnt,ans=0; 13 14 void init(){ 15 memset(head,-1,sizeof(head)); 16 cnt=0; 17 } 18 19 void addedge(int u,int v){ 20 es[cnt].next=head[u]; 21 es[cnt].to=v; 22 head[u]=cnt++; 23 } 24 25 void dfs(int u,int fa){ 26 num[u]++; 27 for(int i=head[u];i!=-1;i=es[i].next){//链式前向星的终止条件错了,结果终止错误 28 if(es[i].to==fa) continue; 29 dfs(es[i].to,u); 30 num[u]+=num[es[i].to]; 31 } 32 if(num[u]%2==0) ans++,num[u]=0; 33 } 34 35 int main(){ 36 scanf("%d",&n); 37 init(); 38 for(int i=1;i<n;i++){ 39 int a,b; 40 scanf("%d%d",&a,&b); 41 addedge(a,b); 42 addedge(b,a); 43 } 44 45 if(n%2==1){ 46 printf("-1 "); 47 return 0; 48 } 49 dfs(1,-1); 50 cout<<ans-1<<endl;//为什么减一不明白 51 return 0; 52 }
以上是关于codeforces补题的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #639 (Div. 2) 补题
Codeforces Round #639 (Div. 2) 补题
Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! (A-C) (持续补题跟进)