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 }
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 }
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 }
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 }
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 }
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 }
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 }