• AcWing周赛 5


    A:水题。

    https://www.acwing.com/problem/content/3729/

     1 #include<iostream>
     2 using namespace std;
     3 const int N=110;
     4 int w[N];
     5 int main()
     6 {
     7     int T;
     8     cin>>T;
     9     while(T--){
    10         int n;
    11         cin>>n;
    12         int maxx=-1;
    13         for(int i=0;i<n;i++){
    14             cin>>w[i];
    15             maxx=max(maxx,w[i]);
    16         }
    17         bool flag=true;
    18         for(int i=0;i<n;i++){
    19             if((maxx-w[i])%2==1){
    20                 flag=false;
    21                 break;
    22             }
    23         }
    24         if(flag) cout<<"YES"<<endl;
    25         else cout<<"NO"<<endl;
    26     }
    27     return 0;
    28 }

    B:https://www.acwing.com/problem/content/3730/

    给定一个目标数组和一个值k,原数组初始全为零,每次操作可以选择原数组中的一个数使其加上k^i ,也可以选择不加,问能否将原数组变为目标数组。

    经过抽象可以发现,题目问的就是目标数组的所有数在k进制的表示下,能否每一位至多只有一个1。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 typedef long long LL;
     6 const int N=70;
     7 int s[N];
     8 int main()
     9 {
    10     int T;
    11     cin>>T;
    12     while(T--){
    13         memset(s,0,sizeof s);
    14         int n,k;
    15         cin>>n>>k;
    16         for(int i=0;i<n;i++){//将每个x的k进制表示的数都加到每一位上去
    17             LL x;
    18             cin>>x;
    19             for(int j=0;x;j++,x/=k){
    20                 s[j]+=x%k;
    21             }
    22         }
    23         bool flag=true;
    24         for(int i=0;i<N;i++){//check
    25             if(s[i]>1){
    26                 flag=false;
    27                 break;
    28             }
    29         }
    30         if(flag) cout<<"YES"<<endl;
    31         else cout<<"NO"<<endl;
    32     }
    33     return 0;
    34 }

    C:最小生成树问题。

    注意建立超级原点。

    https://www.acwing.com/problem/content/3731/

    题目所要求的信息非常多,但是考试的时候最难受的就是需要具体的方案。

    可以通过记录每一个点是经过哪里到达已经确定的树,diistp[ ]。

    之后如果某一点确定为当前距离已确定的树的距离最小的点,distp[ ]即为需要连的边。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define x first
     5 #define y second
     6 using namespace std;
     7 typedef pair<int,int> PII;
     8 typedef long long LL;
     9 const int N=2010;
    10 PII q[N];
    11 int wc[N],wk[N];
    12 int n;
    13 LL get_distance(int a,int b){
    14     int dx=abs(q[a].x-q[b].x);
    15     int dy=abs(q[a].y-q[b].y);
    16     return (LL)(dx+dy)*(wk[a]+wk[b]);
    17 }
    18 
    19 LL dist[N],distp[N];//dist[i]表示i到目前已经确定的树的距离,distp[i]表示从i到目前确定的树是通过哪个点到的
    20 bool st[N];
    21 vector<int> ans1;
    22 vector<PII> ans2;
    23 LL prim(){
    24     //建立超级原点0
    25     for(int i=1;i<=n;i++){
    26         dist[i]=wc[i];
    27     }
    28     dist[0]=0;
    29     st[0]=true;
    30     LL res=0;
    31     for(int i=1;i<=n;i++){
    32         int t=-1;
    33         for(int j=1;j<=n;j++){
    34             if(!st[j]&&(t==-1||dist[t]>dist[j]))
    35                 t=j;
    36         }
    37         st[t]=true;
    38         res+=dist[t];
    39         if(distp[t]==0) ans1.push_back(t);
    40         else ans2.push_back({distp[t],t});
    41         for(int j=1;j<=n;j++){
    42             if(!st[j]&&dist[j]>get_distance(j,t)){
    43                 dist[j]=get_distance(j,t);
    44                 distp[j]=t;
    45             }
    46         }
    47     }
    48     return res;
    49 }
    50 
    51 int main()
    52 {
    53 
    54     cin>>n;
    55     for(int i=1;i<=n;i++) cin>>q[i].x>>q[i].y;
    56     for(int i=1;i<=n;i++) cin>>wc[i];
    57     for(int i=1;i<=n;i++) cin>>wk[i];
    58     LL res=prim();
    59     cout<<res<<endl;
    60     cout<<ans1.size()<<endl;
    61     for(auto& x:ans1) cout<<x<<" ";
    62     cout<<endl;
    63     cout<<ans2.size()<<endl;
    64     for(auto p:ans2) cout<<p.x<<" "<<p.y<<endl;
    65     return 0;
    66 }
  • 相关阅读:
    c++ 容器学习 理论
    TCP和UDP发送数据包的大小问题
    key.go
    election.go
    watch.go
    txn.go
    sort.go
    retry.go
    op.go
    maintenance.go
  • 原文地址:https://www.cnblogs.com/greenofyu/p/14974620.html
Copyright © 2020-2023  润新知