贪心构造专题
CF1530D Secret Santa
给你一个序列
贪心构造,首先次数很简单,就把所有不合法的位置搞掉即可。对于不合法的位置,将可以填上去的数集
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+3;
int T,n,a[maxn],siz[maxn],vis[maxn];
vector<int>v[maxn];
vector<int>t1,s;
int r1[maxn];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
vis[i]=0;
cin>>a[i];
siz[a[i]]++;
v[a[i]].emplace_back(i);
}
for(int i=1;i<=n;i++){
if(siz[i]){
vis[i]=1;
if(siz[i]>1){
for(int j=1;j<siz[i];j++){
t1.emplace_back(v[i][j]);
}
r1[v[i][0]]=i;
}else{
if(v[i][0]==i){
t1.emplace_back(v[i][0]);
}else{
r1[v[i][0]]=i;
}
}
}
}
sort(t1.begin(),t1.end());
for(int i=1;i<=n;i++){
if(!vis[i]){
s.emplace_back(i);
}
}
int len=s.size();
for(int i=0;i<len;i++){
r1[t1[i]]=s[len-i-1];
}
int f1=0;
for(int i=1;i<=n;i++){
if(r1[i]==i){
swap(r1[i],r1[v[a[i]][0]]);
}
}
if(!f1){
cout<<n-len<<'\n';
for(int i=1;i<=n;i++){
cout<<r1[i]<<" \n"[i==n];
}
}
for(int i=1;i<=n;i++){
v[i].clear();
siz[i]=0;
r1[i]=0;
}
s.clear();
t1.clear();
}
signed main(){
cin>>T;
while(T--){
solve();
}
return 0;
}
ABC137D Summer Vacation
给你
考虑带悔贪心,先按
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+3;
int n,m;
struct node{
int a,b;
bool operator<(const node o)const{
if(a!=o.a) return a>o.a;
return b<o.b;
}
}a[maxn];
struct nodee{
int a,b;
bool operator<(const nodee o)const{
if(b!=o.b) return b>o.b;
return a>o.a;
}
};
priority_queue<nodee>q;
int ans,sum,cnt;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].a>>a[i].b;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
int tot=0;
if(m-cnt>=a[i].a){
q.push({a[i].a,a[i].b});
cnt++;
sum+=a[i].b;
ans=max(ans,sum);
}else{
while(!q.empty()&&m-cnt<a[i].a&&tot+q.top().b<=a[i].b){
tot+=q.top().b;
sum-=q.top().b;
cnt--;
q.pop();
}
if(m-cnt>=a[i].a){
q.push({a[i].a,a[i].b});
cnt++;
sum+=a[i].b;
}
ans=max(ans,sum);
}
}
cout<<ans<<'\n';
return 0;
}
P4377 [USACO18OPEN] Talent Show G
给你一序列
分数规划板子题。
分数规划具有单调性,于是我们可以二分一个
满足上式即可,记
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=253;
const double eps=1e-6;
int n,W,a[maxn],b[maxn];
double f[maxn<<3];
bool check(double x){
for(int i=1;i<=W;i++) f[i]=-1e9;
for(int i=1;i<=n;i++){
for(int j=W;j>=0;j--){
int k=min(W,j+a[i]);
f[k]=max(f[k],f[j]+b[i]-x*a[i]);
}
}
return f[W]>0;
}
signed main(){
cin>>n>>W;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
double l=0,r=250000,ans;
while(l+eps<=r){
double mid=(l+r)/2;
if(check(mid)){
l=mid;
}else{
r=mid;
}
}
cout<<int(l*1000);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通