b所有数模k,记录出现次数即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,a[];
int cnt[]={};
cin>>n>>k;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++)
cnt[a[i]%k]++;
int ans=cnt[]/;
int l=,r=k-;
while(l<r){
ans+=min(cnt[l],cnt[r]);
l++,r--;
}
if(l==r)
ans+=cnt[l]/;
cout<<ans*<<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=;i<=n;i++)
cin>>a[i];
sort(a+,a++n);
int l=,r=,ans=; while(){
r++;
if(r>n)break;
if(a[r]-a[l]<=)ans=max(ans,r-l+);
if(a[r]-a[l]>)l++;
}
cout<<ans;
return ;
}
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=;i<=n;i++)cin>>a[i];
for(int j=;j<=n;j++)cin>>b[j];
ll cnt=,ans=,x=;
for(int i=;i<=n;i++){
if(a[i]== && b[i]==)cnt++;//权是0
else if(a[i]== && b[i]!=) continue;//无解
else if(b[i]==)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=;i<=n;i++)cin>>a[i];
sort(a+,a++n);a[]=-;
for(int i=;i<=n;i++)
l[i]=lower_bound(a+,a++n,a[i]-)-a;
int ans=;
for(int i=;i<=k;i++){
int tmp[maxn]={};
for(int j=;j<=n;j++)
tmp[j]=max(tmp[j-],dp[i-][j]); for(int j=i;j<=n;j++){
dp[i][j]=(j-l[j]+)+tmp[l[j]-];
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<<];
int head[maxn],tot;
void init(){memset(head,-,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!=-;i=edge[i].nxt){
int v=edge[i].to;
if(vis[v])continue;
else {
vis[v]=;
cout<<u<<" "<<v<<endl;
dfs(v);
}
}
}
int main(){
cin>>n>>m;
init();
for(int i=;i<=m;i++){
int u,v;
cin>>u>>v;
degree[u]++;
degree[v]++;
addedge(u,v);
addedge(v,u);
}
int id,Max=;
for(int i=;i<=n;i++)
if(degree[i]>Max){
Max=degree[i];
id=i;
} vis[id]=;
for(int i=head[id];i!=-;i=edge[i].nxt)
vis[edge[i].to]=;
for(int i=head[id];i!=-;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<<];
int head[maxn],c[maxn],cnt,d,totc,n,m;
void init(){
memset(head,-,sizeof head);
totc=;
}
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!=-;i=edge[i].nxt){
int v=edge[i].to;
if(c[v]||v==)continue;
dfs(v);
}
} int vis[maxn]; struct A{int u,v;
}ans[maxn];
void dfs1(int u){
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(vis[v])continue;
vis[v]=;
cout<<u<<" "<<v<<'\n';
dfs1(v);
}
} int main(){
cin>>n>>m>>d;
init();
int tmp=,flag[maxn]={};
for(int i=;i<=m;i++){
int u,v;
cin>>u>>v;
if(v==)swap(u,v);
if(u==)flag[v]=,tmp++;
addedge(u,v);
addedge(v,u);
}
if(tmp<d){
puts("NO");
return ;
} for(int i=;i<=n;i++)
if(c[i]==)
++cnt,dfs(i);
if(cnt>d){
puts("NO");
return ;
} int tot=,link[maxn]={};
for(int i=;i<=n;i++){
if(flag[i] && link[c[i]]==){
ans[++tot].u=;
//cout<<tot<<'\n';
ans[tot].v=i;
link[c[i]]=;
vis[i]=;
}
} //把剩下的度用完
for(int i=;i<=n;i++){
if(tot==d)break;
if(flag[i] && vis[i]==){
//cout<<tot<<'\n';
ans[++tot].u=;
ans[tot].v=i;
vis[i]=;
}
} if(tot<d){
puts("NO");
return ;
}
for(int i=;i<=cnt;i++)
if(link[i]==){
puts("NO");
return ;
} puts("YES");
for(int i=;i<=tot;i++)
cout<<ans[i].u<<" "<<ans[i].v<<'\n'; vis[]=;
for(int u=;u<=n;u++)
if(vis[u]){
dfs1(u);
}
}