zoukankan      html  css  js  c++  java
  • R 544

    F2: 什么dfs根本不会啊,只会瞎贪心。。。

    我们考虑先连哪些边,对于u,v两个点,如果u,v所在的联通块都与1相连的话,那我们肯定先不连这种边吧。

    因为太亏了啊。。。

    总而言之我们要在不影响答案的情况下,与1相关的边我们要尽可能地扔到后面。

    那么我们可以先把1拿出来,连来连去变成一片森林,然后我们再在森林之间连来连去,最后去连1.

    dfs代码看不懂啊。。怎么十几行就没了啊。。这是什么东西啊。。。

    upd:看懂了。首先随便dfs一下,因为dfs是从下到上的,所以到最后与1相连的边就是最少的need,那么有解的话这个need应该小于d。

    那么现在我们可以遍历一下与1直接相连的点,如果这个点跟其他的点连了,那么我们可以把这条边挪到1这里来。

    放一下我瞎搞的贪心代码。。。

     1 #include <bits/stdc++.h>
     2 #define pii pair<int,int>
     3 #define mk(a,b) make_pair(a,b)
     4 using namespace std;
     5 int n,m,d;
     6 int fa[200005],b[200005];
     7 int find(int a){
     8     return a==fa[a]?a:fa[a]=find(fa[a]);
     9 }
    10 bool unite(int x,int y){
    11     x=find(x),y=find(y);
    12     if(x==y)return 0;
    13     if(b[x])fa[y]=x;
    14     else fa[x]=y;
    15     return 1;
    16 }
    17 int u[200005],v[200005];
    18 vector<int> g;
    19 vector<pii>ans;
    20 int main(){
    21     ios::sync_with_stdio(false);
    22     cin>>n>>m>>d;
    23     for(int i=1;i<=n;i++)fa[i]=i;
    24     for(int i=1;i<=m;i++){
    25         cin>>u[i]>>v[i];
    26         if(u[i]==1){
    27             g.push_back(v[i]);
    28             b[v[i]]=1;
    29         } else if(v[i]==1){
    30             g.push_back(u[i]);
    31             b[u[i]]=1;
    32         }
    33     }
    34     int tot = n-1;
    35     for(int i=1;i<=m;i++){
    36         if(tot<=d)break;
    37         int fa = find(u[i]),fb=find(v[i]);
    38         if(b[fa]&&b[fb])continue;
    39         if(u[i]!=1&&v[i]!=1&&unite(u[i],v[i])){
    40             ans.push_back(mk(u[i],v[i]));
    41             tot--;
    42         }
    43     }
    44     for(int i=1;i<=m;i++){
    45         if(tot<=d)break;
    46         int fa = find(u[i]),fb=find(v[i]);
    47         if(b[fa]&&b[fb]&&u[i]!=1&&v[i]!=1&&unite(u[i],v[i])){
    48             ans.emplace_back(mk(u[i],v[i]));
    49             tot--;
    50         }
    51     }
    52     for(auto x:g){
    53         if(unite(1,x))
    54             d--,tot--,ans.push_back(mk(1,x));
    55         if(tot==0||d==0)
    56             break;
    57     }
    58     if(tot!=0){
    59         cout<<"NO"<<endl;
    60     } else{
    61         cout<<"YES"<<endl;
    62         for(auto tmp:ans){
    63             cout<<tmp.first<<' '<<tmp.second<<'
    ';
    64         }
    65     }
    66 }
    View Code

    F1:找个最大的点,然后加边

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 2e5+5;
     4 vector<int> g[N];
     5 int n,m,d[N],fa[N],u[N],v[N];
     6 int find(int a){
     7     return a==fa[a]?a:fa[a]=find(fa[a]);
     8 }
     9 bool unite(int x,int y){
    10     x=find(x),y=find(y);
    11     if(x==y)return 0;
    12     fa[x]=y;
    13     return 1;
    14 }
    15 vector<pair<int,int>> ans;
    16 int main(){
    17     ios::sync_with_stdio(false);
    18     cin>>n>>m;
    19     for(int i=1;i<=n;fa[i]=i,i++);
    20     for(int i=1;i<=m;i++){
    21         cin>>u[i]>>v[i];
    22         g[u[i]].push_back(v[i]);
    23         g[v[i]].push_back(u[i]);
    24         d[u[i]]++,d[v[i]]++;
    25     }
    26     int mx=0,id=-1;
    27     for(int i=1;i<=n;i++)
    28         if(d[i]>mx)mx=d[i],id=i;
    29     for(auto x:g[id]){
    30         unite(x,id);
    31         ans.push_back(make_pair(x,id));
    32     }
    33     for(int i=1;i<=m;i++){
    34         if(unite(u[i],v[i]))
    35             ans.push_back(make_pair(u[i],v[i]));
    36     }
    37     for(auto x:ans)
    38         cout<<x.first<<' '<<x.second<<endl;
    39 }
    View Code

    E:考虑dp和贪心(雾),用dp[i][j]表示到第i个位置分为j组。 如果不管i那么就是 dp[i-1][j],如果管了i的话,那么一定是放到(i-5)那一组里最优吧。

    然后可以先预处理一下每个数最左能放到哪。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,k;
     4 int a[5050],id[5050];
     5 int dp[5050][5050];
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     cin>>n>>k;
     9     for(int i=1;i<=n;i++){
    10         cin>>a[i];
    11     }
    12     sort(a+1,a+1+n);
    13     for(int i=1;i<=n;i++){
    14         id[i]=lower_bound(a+1,a+1+i,a[i]-5)-a;
    15     }
    16     for(int i=1;i<=n;i++){
    17         for(int j=1;j<=k;j++){
    18             dp[i][j]=max(dp[id[i]-1][j-1]+i-id[i]+1,dp[i-1][j]);
    19         }
    20     }
    21     cout<<dp[n][k];
    22 }
    View Code

    D:这什么啊??哪里来的数论啊,直接map存一下找个最多的不就行了吗,这范围也卡不了精度啊我看。。

     1 #include <bits/stdc++.h>
     2 #define rep(x) for(int i=1;i<=x;i++)
     3 using namespace std;
     4 typedef long double db;
     5 int n;db a[200005],b[200005];
     6 map<db,int>m;
     7 int main(){
     8     ios::sync_with_stdio(false);
     9     cin>>n;
    10     rep(n)cin>>a[i];
    11     rep(n)cin>>b[i];
    12     int ans=0;
    13     rep(n){
    14         if(a[i]!=0)
    15             m[b[i]/a[i]]++;
    16         else{
    17             if(b[i]==0)
    18                 ans++;
    19         }
    20     }
    21     int tmp=ans;
    22     ans=0;
    23     for(auto t:m){ans=max(ans,t.second);}
    24     cout<<ans+tmp<<endl;
    25 }
    View Code

    C:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int n,a[200005];
     5 map<int,int> mp;
     6 map<int,int>::iterator it;
     7 int main(){
     8     ios::sync_with_stdio(false);
     9     cin>>n;
    10     for(int i=1;i<=n;i++)cin>>a[i],mp[a[i]]++;
    11     ll ans = 0;
    12     for(it=mp.begin();it!=mp.end();it++){
    13         ll tmp = it->second;
    14         for(int i=1;i<=5;i++){
    15             if(mp.count(it->first+i)){
    16                 tmp+=mp[it->first+i];
    17             }
    18         }
    19         ans=max(ans,tmp);
    20     }
    21     cout<<ans;
    22 }
    View Code

    B:好难。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,k,x,b[105];
     4 int main(){
     5     ios::sync_with_stdio(false);
     6     cin>>n>>k;
     7     for(int i=1;i<=n;i++){
     8         cin>>x,b[x%k]++;
     9     }
    10     int ans = b[0]/2;
    11     for(int i=1;i<k;i++){
    12         if(i==k-i) ans+=b[i]/2;
    13         else if(i<k-i)ans+=min(b[i],b[k-i]);
    14     }
    15     ans<<=1;
    16     cout<<ans<<endl;
    17 }
    View Code

    A:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 string s,t;
     4 void g(){cout<<setfill('0')<<setw(2);}
     5 int main(){
     6     ios::sync_with_stdio(false);
     7     cin>>s>>t;
     8     int t1=0,t2=0;
     9     t1=(s[0]-'0')*10+(s[1]-'0');
    10     t1*=60;
    11     t1+=(s[3]-'0')*10+(s[4]-'0');
    12     t2=(t[0]-'0')*10+(t[1]-'0');
    13     t2*=60;
    14     t2+=(t[3]-'0')*10+t[4]-'0';
    15     int tmp = t1+t2>>1;
    16     int res = tmp/60;tmp%=60;
    17     g();
    18     cout<<res<<':';
    19     g();
    20     cout<<tmp<<endl;
    21 }
    View Code
  • 相关阅读:
    马拉车算法
    n皇后问题(回溯算法)
    求解最大升序子序列问题(动态规划)
    利用二进制进行快速乘法:俄罗斯农名乘法
    Redis、MySQL、Hive、Hbase的区别,数据库和数据仓库的区别
    MySQL数据库
    算法工程师的Bug与Debug
    复习KNN并实现
    文本领域数据增强技术
    Fasttext模型总结
  • 原文地址:https://www.cnblogs.com/MXang/p/10519982.html
Copyright © 2011-2022 走看看