codeforces Round #611

这种凌晨场真的折寿

就过了四题,8wa结尾心态炸裂,求别被hack,再hack就要爬了

A2   B8   C38(1)   E1:58(7)

D题感觉可以写,但是没有时间看了。幸好E最后发现了自己的错误。

 

A题:看到题的时候感觉好温馨,算时间,感动到了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #define mem(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 #define mod 1000000007
14 const int maxn=1e5+10;
15 int main()
16 {
17     int t;
18     scanf("%d",&t);
19     while(t--){
20         int n,m;
21     cin>>n>>m;
22     int sum=60-m+(23-n)*60;
23     printf("%d\n",sum);
24     }
25     return 0;
26 }
View Code

 

B题:看到题的那一刻,又感动到了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #define mem(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 #define mod 1000000007
14 const int maxn=1e5+10;
15 int main()
16 {
17     int t;
18     scanf("%d",&t);
19     while(t--){
20         int n,m;
21         cin>>n>>m;
22         int zx=n/m,ge=m/2;
23         int sheng=n-zx*m;
24         if(sheng>=ge){
25             printf("%d\n",zx*m+ge);
26         }
27         else{
28             printf("%d\n",zx*m+sheng);
29         }
30     }
31     return 0;
32 }
View Code

 

C题:这题是hack最多的 QAQ求求求了别注意到我

题意:给n个数字,0或者1~n之间,把0替换成1~n中没出现过的,同时满足不等于它所在的位置下标

思路:暴力……?感觉自己要被hack的……但算了算复杂度没超

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #define mem(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 #define mod 1000000007
14 const int maxn=2e5+10;
15 int a[maxn],pos[maxn]={0},p[maxn];
16 int main()
17 {
18     int n;
19     queue<int>q;
20     scanf("%d",&n);
21     int t=0;
22     for(int i=1;i<=n;i++){
23         scanf("%d",&a[i]);
24         if(!a[i]){
25             p[t++]=i;
26         }
27         else{
28             pos[a[i]]=1;
29         }
30     }
31     for(int i=1;i<=n;i++){
32         if(!pos[i]){q.push(i);}
33     }
34     for(int i=0;i<t-2;i++){
35         int wei=q.front();q.pop();
36         if(wei!=p[i]){
37             a[p[i]]=wei;
38         }
39         else{
40             q.push(wei);
41             wei=q.front();q.pop();
42             a[p[i]]=wei;
43         }
44     }
45     int wei=q.front();q.pop();int wei2=q.front();
46     if(p[t-1]!=wei && p[t-2]!=wei2){
47         a[p[t-1]]=wei;a[p[t-2]]=wei2;
48     }
49     else{
50         a[p[t-2]]=wei;a[p[t-1]]=wei2;
51     }
52     for(int i=1;i<=n;i++){
53         printf(i==n?"%d\n":"%d ",a[i]);
54     }
55     return 0;
56 }
View Code

 

E题:这是我wa最多,花时间找错误最多的

题意:给一个n,输入n个数(1~n),代表人所在的房子序号,人可以左右移动一格或者不动,但只能移动一次。问最小,最多的可以住不同的房子

思路:缩小,扩大,扩大考虑房子序号出现次数1次,2次,大于等于3次,优先考了右边,然后是不动,再是左边。缩小,遇到房子序号出现次数为0的跳过,遇到不是0的,考虑111,101,110,100四种情况即可。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #define mem(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 #define mod 1000000007
14 const int maxn=2e5+10;
15 int a[maxn]={0},vis[maxn]={0},pos[maxn]={0},k;
16 int main()
17 {
18     int n;
19     int sum=0,ans=0;
20     scanf("%d",&n);
21     for(int i=0;i<n;i++){
22         scanf("%d",&k);
23         pos[k]++;
24         vis[k]++;
25     }
26     for(int i=1;i<=n;i++){
27         if(pos[i]==1){
28            if(!a[i-1]){a[i-1]=1;}
29            else if(!a[i]){a[i]=1;}
30            else if(!a[i+1]){a[i+1]=1;}
31         }
32         else if(pos[i]==2){
33             if(!a[i-1]){
34                 a[i-1]=1;
35                 if(!a[i]){a[i]=1;}
36                 else if(!a[i+1]){a[i+1]=1;}
37             }
38             else{
39                 a[i]=1;
40                 a[i+1]=1;
41             }
42         }
43         else if(pos[i]>=3){
44             a[i]=1;a[i-1]=1;a[i+1]=1;
45         }
46     }
47     for(int i=0;i<=n+1;i++){if(a[i]){sum++;}}
48     for(int i=1;i<=n;i++){
49         if(vis[i] && vis[i+2] && vis[i+1]){
50             ans++;i=i+2;
51         }
52         else if(vis[i] && vis[i+1] && !vis[i+2]){
53             ans++;i=i+2;
54         }
55         else if(vis[i] && !vis[i+1] && vis[i+2]){
56             ans++;i=i+2;
57         }
58         else if(vis[i] && !vis[i+1] && !vis[i+2]){
59             ans++;i=i+2;
60         }
61  
62    }
63    printf("%d %d\n",ans,sum);
64     return 0;
65 }
View Code

 

D和F等期末考完再补吧。希望期末全过啊

 

upd

补题D题:

题意:给n个树的位置,求m个人离树最小的距离之和

思路:往外扩,bfs

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #define mem(a,b) memset(a,b,sizeof(a))
10 using namespace std;
11 #define ll long long
12 #define inf 0x3f3f3f3f
13 #define mod 998244353
14 const int maxn=2e5+10;
15 struct node{
16     int n,m;
17     node(){}
18     node(int nn,int mm):n(nn),m(mm){}
19 };
20 map<int,bool>vis;
21 queue<node>q;
22 int pos[maxn],t=0,n,m,k;
23 ll bfs(){
24     ll ans=0;
25     while(m>0 && !q.empty()){
26         node tk=q.front();q.pop();
27         if(!vis[tk.n]){
28             ans+=(ll)tk.m;pos[t++]=tk.n;m--;vis[tk.n]=1;
29             q.push(node(tk.n+1,tk.m+1));
30             q.push(node(tk.n-1,tk.m+1));
31         }
32     }
33     return ans;
34 }
35 int main()
36 {
37     scanf("%d%d",&n,&m);
38     for(int i=0;i<n;i++){
39         scanf("%d",&k);
40         vis[k]=1;q.push(node(k+1,1));q.push(node(k-1,1));
41     }
42     printf("%lld\n",bfs());
43     for(int i=0;i<t;i++){
44         printf(i==t-1?"%d\n":"%d ",pos[i]);
45     }
46     return 0;
47 }
View Code

前几天一直练搜索题……比赛时候搜索题题目都没看……

 

 

F题的题意有点难懂

就是给n个1~n的点,第i个点的价值是2^i(0<i<n+1),每个点链接的线,有一个主点和副点,主点的价值等于主点的价值加上其所有的副点价值(包含副点的副点价值等等)

给n-1个数字a,代表价值从大到小的主点位置,求线段两点的价值从大到小的位置

题解,感觉有点像拓扑排序,入度点,并且要求小的先出,所以用优先队列

还是看了别人的题解写的,呜呜呜,题意根本没读懂

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<vector>
 9 #include<queue>
10 #define mem(a,b) memset(a,b,sizeof(a))
11 using namespace std;
12 #define ll long long
13 #define inf 0x3f3f3f3f
14 #define mod 998244353
15 const int maxn=2e5+10;
16 int vis[maxn],du[maxn],a[maxn];
17 vector<pair<int,int> > v;
18 priority_queue<int,vector<int>,greater<int> >q;
19 int n;
20 int main()
21 {
22    cin>>n;
23    for(int i=1;i<n;i++){
24     cin>>a[i];
25     vis[a[i]]=1,du[a[i]]++;
26    }
27    for(int i=1;i<=n;i++){
28     if(!vis[i]){q.push(i);}
29    }
30    for(int i=n-1;i;i--){
31     int t=q.top();q.pop();
32     du[a[i]]--;
33     v.push_back(make_pair(t,a[i]));
34     if(!du[a[i]]){q.push(a[i]);}
35    }
36    printf("%d\n",a[1]);
37    for(int i=n-2;i>=0;i--){
38     printf("%d %d\n",v[i].first,v[i].second);
39    }
40     return 0;
41 }
View Code
posted @ 2019-12-29 05:17  ouluy  阅读(159)  评论(0编辑  收藏  举报