zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",zx*m+ge);
    26         }
    27         else{
    28             printf("%d
    ",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
    ":"%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
    ",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
    ",bfs());
    43     for(int i=0;i<t;i++){
    44         printf(i==t-1?"%d
    ":"%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
    ",a[1]);
    37    for(int i=n-2;i>=0;i--){
    38     printf("%d %d
    ",v[i].first,v[i].second);
    39    }
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    html中滚动条的样式
    在个人机上发布web项目
    Apache与SVN的集成
    待完成
    chmod
    【转】ubuntu修改IP地址和网关的方法
    ubuntu 添加svn服务
    生成指定大小的空文件
    数码单反相机完全攻略
    【转】ubuntu subversion安装
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/12114042.html
Copyright © 2011-2022 走看看