cf1133 bcdef

b所有数模k,记录出现次数即可

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k,a[200005];
    int cnt[200]={};
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)
        cnt[a[i]%k]++;
    int ans=cnt[0]/2;
    int l=1,r=k-1;
    while(l<r){
        ans+=min(cnt[l],cnt[r]);
        l++,r--;
    }
    if(l==r)
        ans+=cnt[l]/2;
    cout<<ans*2<<endl;
}

c尺取

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
int cmp(int a,int b){return a<b;
}
int main(){
    int n,a[maxn];
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+1+n);
    int l=1,r=0,ans=0;
    
    while(1){
        r++;
        if(r>n)break;
        if(a[r]-a[l]<=5)ans=max(ans,r-l+1);
        if(a[r]-a[l]>5)l++;
    }
    cout<<ans;
    return 0;
}

d,用map<pair<ll,ll>,int>来统计二元组<a[i]/gcd,b[i]/gcd>的最大出现次数即可,注意特判

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long 
ll n,a[maxn],b[maxn];
map<pair<ll,ll>,ll>mp;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int j=1;j<=n;j++)cin>>b[j];
    ll cnt=0,ans=0,x=0;
    for(int i=1;i<=n;i++){
        if(a[i]==0 && b[i]==0)cnt++;//权是0 
        else if(a[i]==0 &&  b[i]!=0) continue;//无解 
        else if(b[i]==0)x++; //c必须是0 
        else {
            ll tmp=__gcd(a[i],b[i]);
            pair<ll,ll> p=make_pair(b[i]/tmp,a[i]/tmp);
            mp[p]++;ans=max((ll)ans,mp[p]); 
        }
    }
    
    if(cnt==n)cout<<cnt;
    else cout<<max(x+cnt,ans+cnt);
}

e,线性dp

/*
l[i]表示选择以第i个为最大能力成员的团队中能力最小的成员的下标是什么
阶段k,状态j表示选择第j个成员作为第k组能力最大的成员
那么第k组的范围就是[l[j],j],dp[k][j]=len[j]+max(dp[k-1][l[j]-i]),i小于l[j]即可) 
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 5005
int n,k,dp[maxn][maxn],a[maxn],l[maxn];
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);a[0]=-1;
    for(int i=1;i<=n;i++)
        l[i]=lower_bound(a+1,a+1+n,a[i]-5)-a;
    int ans=0;
    for(int i=1;i<=k;i++){
        int tmp[maxn]={};
        for(int j=1;j<=n;j++)
            tmp[j]=max(tmp[j-1],dp[i-1][j]);
        
        for(int j=i;j<=n;j++){
            dp[i][j]=(j-l[j]+1)+tmp[l[j]-1];    
            ans=max(dp[i][j],ans);
        }
    }
    cout<<ans<<endl;
}

f1找最大点度数最大的生成树

 #include<bits/stdc++.h>
using namespace std;
#define maxn 200005
struct Edge{int to,nxt;}edge[maxn<<1];
int head[maxn],tot;
void init(){memset(head,-1,sizeof head);tot++;}
void addedge(int u,int v){
    edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}

int n,m,degree[maxn],vis[maxn];
void dfs(int u){
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(vis[v])continue;
        else {
            vis[v]=1;
            cout<<u<<" "<<v<<endl;
            dfs(v);
        }
    }
}
int main(){
    cin>>n>>m;
    init();
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        degree[u]++;
        degree[v]++;
        addedge(u,v);
        addedge(v,u);
    }
    int id,Max=0;
    for(int i=1;i<=n;i++)
        if(degree[i]>Max){
            Max=degree[i];
            id=i;
        }
        
    vis[id]=1;
    for(int i=head[id];i!=-1;i=edge[i].nxt)
        vis[edge[i].to]=1;
    for(int i=head[id];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        cout<<id<<" "<<v<<endl;
        dfs(v); 
    }
}

 f2

/*
给定一个无向连接图,求出1的度为d的生成树 
删掉结点1,对剩下结点染色
不成立的情况:
    1的度小于d
    联通块大于d
    1能连上的联通块小于d 
*/
#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define maxn 200005
struct Edge{int to,nxt;}edge[maxn<<1];
int head[maxn],c[maxn],cnt,d,totc,n,m;
void init(){
    memset(head,-1,sizeof head);
    totc=0;
} 
void addedge(int u,int v){
    edge[totc].to=v;edge[totc].nxt=head[u];head[u]=totc++;
}
void dfs(int u){
    c[u]=cnt;
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(c[v]||v==1)continue;
        dfs(v);
    }
}

int vis[maxn];

struct A{int u,v;
}ans[maxn];
void dfs1(int u){
    for(int i=head[u];i!=-1;i=edge[i].nxt){
        int v=edge[i].to;
        if(vis[v])continue;
        vis[v]=1;
        cout<<u<<" "<<v<<'
';
        dfs1(v);
    }
}

int main(){
    cin>>n>>m>>d;
    init();
    int tmp=0,flag[maxn]={};
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        if(v==1)swap(u,v);
        if(u==1)flag[v]=1,tmp++;
        addedge(u,v);
        addedge(v,u);
    }
    if(tmp<d){
        puts("NO");
        return 0;
    }
    
    for(int i=2;i<=n;i++)
        if(c[i]==0)
            ++cnt,dfs(i);
    if(cnt>d){
        puts("NO");
        return 0; 
    }
    
    int tot=0,link[maxn]={};
    for(int i=2;i<=n;i++){
        if(flag[i] && link[c[i]]==0){
            ans[++tot].u=1;
//cout<<tot<<'
';
            ans[tot].v=i;
            link[c[i]]=1;
            vis[i]=1;
        }    
    }
    
    //把剩下的度用完
    for(int i=2;i<=n;i++){
        if(tot==d)break;
        if(flag[i] && vis[i]==0){
//cout<<tot<<'
';    
            ans[++tot].u=1;
            ans[tot].v=i;
            vis[i]=1;
        }
    }
    
    if(tot<d){
        puts("NO");
        return 0;
    }
    for(int i=1;i<=cnt;i++)
        if(link[i]==0){
            puts("NO");
            return 0;
        }
    
    puts("YES");
    for(int i=1;i<=tot;i++)
        cout<<ans[i].u<<" "<<ans[i].v<<'
';
    
    vis[1]=1;
    for(int u=2;u<=n;u++)
        if(vis[u]){
            dfs1(u);
        }
}
原文地址:https://www.cnblogs.com/zsben991126/p/10493935.html