首页 > 其他 > 详细

cf1133

时间:2019-03-08 10:06:04      阅读:201      评论:0      收藏:0      [点我收藏+]

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

 

cf1133

原文:https://www.cnblogs.com/zsben991126/p/10493935.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!