CF每日4题(1300-1400)

2026B 贪心 1300

我的思路和dalao很像

cpp 复制代码
void solve(){
	int n;cin>>n;
	vector<int>a(n+1);
	forr(i,1,n)cin>>a[i];
	int fg=(n&1),ans;
	if(fg){
		ans=1e18+10;
		forr(i,1,n){//枚举把一个数去掉,其他两两组合
			int tmp=1,j=1;
			while (j<=n)
			{
				if(j==i)j++;
				int pre=a[j++];
				if(j==i)j++;
				if(j>n)break;
				int now=a[j++];
				if(j==i)j++;
				tmp=max(now-pre,tmp);
			}
		
			ans=min(ans,tmp);
		}
		cout<<ans<<endl;
	}else{
		ans=0;
		for(int i=2;i<=n;i+=2){
			ans=max(a[i]-a[i-1],ans);
		}
		cout<<ans<<endl;
	}
}

2033E 思维 贪心 1400

题意:

  • 原始数列两两调换位置,让每个数满足 p i = i , p p i = i p_i=i,p_{p_i}=i pi=i,ppi=i
  • 就是下标 i i i指向下标 p i p_i pi,形成自己指自己、两个互指

思路:把题意抽象成环

  • 交换就是改变一对儿边的指向,一个有x点的环要形成 ⌈ x 2 ⌉ = x + 1 2 \lceil {x\over 2}\rceil={{x+1}\over2} ⌈2x⌉=2x+1个小环,需要变 x + 1 2 − 1 {{x+1}\over2}-1 2x+1−1条边
cpp 复制代码
const int N=1e6+10;
//并查集
int fa[N],cnt[N];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
void merge(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx==fy)return;
    if(x!=y)cnt[fx]+=cnt[fy],fa[fy]=fx;
}
void solve()
{
    int n;
    cin>>n;
    forr(i,1,n)fa[i]=i,cnt[i]=1;
    vector<int>p(n+1);
    forr(i,1,n){
        cin>>p[i];
        merge(i,p[i]);//建环
    }
    int ans=0;
    forr(i,1,n){
        if(fa[i]==i){
            ans+=(cnt[i]-1)/2;
        }
    }
    cout<<ans<<endl;

}

2013C 交互题 思维 1400

注意找子串是在全串中匹配,一开始犯傻以为是从字符串首开始匹配的...

  • 向后加0/1(加到厌倦),直到不是子串
  • 不匹配后向前拓展,就得到了目标字符串
cpp 复制代码
int query(string s){
    cout<<"? "<<s<<endl;
    cout.flush();
    int ans;cin>>ans;
    return ans;
}
void solve()
{
    int n;cin>>n;
    int len=0;
    string s="";
    //向后找
    while (len<n)
    {
        if(query(s+'0')){
            s+='0';len++;
            continue;
        }
        if(query(s+'1')){
            s+='1';len++;
            continue;
        }else{
            break;//添1添0都不是子串 向后加的加完了
        }
    }
    //向前加
    while (len<n)
    {
        if(query('0'+s)){
            s='0'+s;len++;
            continue;
        }
        s='1'+s;len++;
    }
    cout<<"! "<<s<<endl;
}

1967A 思维 贪心 1400

思路:最大化最小值,然后分配

最大化最小值怎么操作很犯难,于是看了题解

cpp 复制代码
void solve()
{
    int n,k;cin>>n>>k;
    vector<int>a(n+1);
    forr(i,1,n)cin>>a[i];
    sort(a.begin()+1,a.end());
    int sum=0,rg,wst;
    forr(i,1,n){
        sum+=a[i];
        if(a[i]*i-sum<=k)rg=i,wst=a[i]*i-sum;
    }
    k-=wst;
    int div=k/rg;//剩下的再均分
    int rst=k%rg;//均分后剩下的
    int minn=a[rg]+div;//最大化的最小值 多个较少的值平均后相等
    
    // cout<<"!!!"<<endl;
    // forr(i,1,rg)cout<<minn<<' ';
    // forr(i,rg+1,n)cout<<a[i]<<' ';cout<<endl;

    // cout<<(minn-1)*n+1<<endl;//较少的值排列组合的贡献 末尾的一组只能贡献1个
    // cout<<n-rg<<endl;//较大的值剩下的
    // cout<<rst<<endl;//k分配完后剩下的
    // cout<<endl;
    cout<<(minn-1)*n+1+(n-rg+rst)<<endl;
}
相关推荐
imuliuliang5 小时前
关于数据结构在算法设计中的核心作用解析7
算法
code_pgf6 小时前
C++11 / C++14 / C++17 / C++20 新特性总结
c++·c++20
魔力女仆6 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915537 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋7 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
普通网友8 小时前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
颜x小9 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
ldmd2849 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成
weixin_423652139 小时前
C#使用JObject
开发语言·c#