• Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020


    涵盖知识点:贪心、并查集、模拟。

    比赛链接:

    http://codeforces.com/contest/1315

    A:Dead Pixel

    题意:窗口中有一个坏点,求不包含坏点的最大矩形窗口面积。

    题解:遍历被坏点分割的四个矩形区域取最大值即可。

    Accept Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int main(){
     5     int t;
     6     cin>>t;
     7     while(t--){
     8         int a,b,x,y;
     9         cin>>a>>b>>x>>y;
    10         int res=0;
    11         res=max(res,a*(b-y-1));
    12         res=max(res,b*(a-x-1));
    13         res=max(res,a*y);
    14         res=max(res,b*x);
    15         cout<<res<<"
    ";
    16     }
    17     return 0;
    18 }

    B:Homecoming

    题意:一条n个路口的路,每个路口有AB两种类型,对于i~j区间中,若所有值都相同,即可花费a或b从i到达j+1.现在总共有p的钱,问最小从哪个点开始可以到达第n个路口。

    题解:逆向模拟。注意处理边界。

    Accept Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int main(){
     5     int t;
     6     cin>>t;
     7     while(t--){
     8         int a,b,p;
     9         cin>>a>>b>>p;
    10         string s;
    11         cin>>s;
    12         for(int i=s.length()-2;i>=0;i--){
    13             if(s[i]=='B')p-=b;
    14             else p-=a;
    15             if(p<0){
    16                 cout<<i+2<<"
    ";
    17                 break;
    18             }
    19             bool flag=true;
    20             for(int j=i-1;j>=0;j--){
    21                 if(s[j]!=s[i]){
    22                     flag=false;
    23                     i=j+1;
    24                     break;
    25                 }
    26             }
    27             if(flag||i==0){
    28                 cout<<"1
    ";
    29                 break;
    30             }
    31         }
    32     }
    33     return 0;
    34 }

    C:Restoring Permutation

    题意:给定一个序列b。求是否存在最小的1~2n的排列a满足bi=min(ai*2-1,ai*2)。

    题解:选定ai*2为第一个大于bi的值。若不存在则不存在序列。可用set二分,也可以遍历。

    Accept Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=110;
     4 int a[maxn],b[maxn];
     5 bool vis[maxn<<1];
     6 void solve(){
     7     memset(vis,false,sizeof vis);
     8     int n;
     9     cin>>n;
    10     for(int i=1;i<=n;i++) {
    11         cin >> b[i];
    12         vis[b[i]]=true;
    13     }
    14     for(int i=1;i<=n;i++){
    15         a[i*2-1]=b[i];
    16         bool flag=false;
    17         for(int j=b[i]+1;j<=n*2;j++){
    18             if(vis[j])continue;
    19             vis[j]=true;
    20             a[i*2]=j;
    21             flag=true;
    22             break;
    23         }
    24         if(!flag){
    25             cout<<"-1
    ";
    26             return;
    27         }
    28     }
    29     for(int i=1;i<=2*n;i++){
    30         cout<<a[i]<<" ";
    31     }
    32     cout<<"
    ";
    33 }
    34 int main(){
    35     int t;
    36     cin>>t;
    37     while(t--){
    38         solve();
    39     }
    40     return 0;
    41 }

    D:Recommendations

    题意:给定所有书籍的本数以及增加1本所需消费。求最小花费使得所有书籍数量不同。

    题解:贪心。所有书籍按照所需消费从大到小排序。越靠前增加的次数越少。并查集维护当前num至少要增加到多少。

    Accept Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=2e5+10;
     4 typedef long long ll;
     5 struct Node{
     6     ll num,t;
     7     bool operator <(const Node &b)const{
     8         if(t==b.t)return num<b.num;
     9         return t>b.t;
    10     }
    11 }a[maxn];
    12 map<int,int> pre;
    13 int findx(int x){
    14     return pre[x]==0?x:pre[x]=findx(pre[x]);
    15 }
    16 void merge(int x,int y){
    17     int i=findx(x),j=findx(y);
    18     if(i!=j)pre[i]=j;
    19 }
    20 int main(){
    21     int n;
    22     cin>>n;
    23     for(int i=1;i<=n;i++)
    24         cin>>a[i].num;
    25     for(int i=1;i<=n;i++)
    26         cin>>a[i].t;
    27     sort(a+1,a+n+1);
    28     ll ans=0;
    29     for(int i=1;i<=n;i++){
    30         int res=findx(a[i].num);
    31         if(res==a[i].num)merge(res,res+1);
    32         else{
    33             merge(res,res+1);
    34             ans+=1ll*(res-a[i].num)*a[i].t;
    35         }
    36     }
    37     cout<<ans<<"
    ";
    38     return 0;
    39 }

    E:Double Elimination

    F:Au Pont Rouge

  • 相关阅读:
    DataGridView编辑后立即更新到数据库的两种方法
    Azure 意外重启, 丢失sql server master表和 filezilla
    欧洲美食精选-德国篇
    Azure 负载均衡和可用性集
    windows Azure 域名绑定
    Azure billing 分析(2)
    Azure billing 分析
    试用windows Azure
    Excel公式无法重算,暂无法解决
    iphone 语音备忘录 同步问题
  • 原文地址:https://www.cnblogs.com/charles1999/p/12358721.html
Copyright © 2020-2023  润新知