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<<'\n';
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

 

posted @ 2019-03-13 16:34  MXang  阅读(204)  评论(0编辑  收藏  举报