码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces补题

时间:2018-10-02 20:09:37      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:一个   article   top   oid   语句   splay   个人   play   eof   

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\n");
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\n");
18             return 0;
19         }
20     }
21     printf("Yes\n");
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 }
View Code

 优先队列的用法:

首先明确队列默认由大到小,由小到大可以为 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\n");
47         return 0;
48     }
49     dfs(1,-1);
50     cout<<ans-1<<endl;//为什么减一不明白 
51     return 0;
52 } 
View Code

 

codeforces补题

标签:一个   article   top   oid   语句   splay   个人   play   eof   

原文地址:https://www.cnblogs.com/pandaking/p/9737530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!