Codeforces Round 1075 (Div. 2)复盘 A-C2

比赛链接

A 模拟 略

B 贪心

https://codeforces.com/contest/2189/problem/B
思路:先把不需要回滚的跳了 再去选择一个最优的一直跳 记录对应的回滚次数

点击查看代码
void solution::solve()
{
    int n,x;cin>>n>>x;
    vii a(n,vi(3));
    int sum=0;
    for(int i=0;i<n;i++) cin>>a[i][0]>>a[i][1]>>a[i][2];
    vi s(n,0);
    for(int i=0;i<n;i++)
    {
        sum+=a[i][0]*(a[i][1]-1);
        s[i]=a[i][1]*a[i][0]-a[i][2];   
        //记录每个跳跃回滚一次时可以前进的距离
    }
    sort(s.rbegin(),s.rend());
    if(sum<x&&s[0]<=0) return cout<<-1<<endl,void();
    //如果没到达 而且无法继续前进 输出-1
    else if(sum>=x) return cout<<0<<endl,void();
    int res=x-sum;
    int cnt=res/s[0]+(res%s[0]?1:0);
    cout<<cnt<<endl;
}

C1 构造

思路:n分奇偶 具体看代码吧()TT
其实主要思路就是 固定一个a[i]^i的值 固定在最后
因为放在最后的数字没有任何限制

点击查看代码
void solution::solve()
{
    int n;cin>>n;
    if(n%2)
    {
        cout<<n-1<<' ';
        for(int i=2;i<=n-1;i++) 
        {
            cout<<(i^1)<<' ';
        }
        cout<<1<<endl;
    }
    else 
    {
        int f=n;
        if(f^(n-1)>=n) f=1;
        //当n或n-1==2^x时 n^(n-1)>n
        cout<<n+1-f<<' ';
        for(int i=2;i<=n-1;i++) cout<<(f^i)<<' ';
        cout<<f<<endl;
    }
}

C2 构造

思路:比c1多了一个a[1] 考虑到奇数的情况其实是符合的 主要是偶数的情况
n=2^x时必然不存在对应的构造 假定与c1的构造相同 这种情况下 f=1
但是i=1时的a[1]^1=n+1 可以知道必然不存在这种情况
那么 如何在n为偶数的其他情况下构造出呢
swap(a[r],a[1]) -> r=n-(1<<x) -> x=lg(n)
因为令a[r]=n时 可以使得n ^ r=2 ^ x (<n) 且必然大于r
这是因为构造的方案是令a[i]^i=1 所以其实是构造出类似3254 这种n+1->n (n为偶数)

点击查看代码
void solution::solve()
{
    int n;cin>>n;
    if(n==(1<<(__lg(n)))) return cout<<-1<<endl,void();
    else if((n)%2)
    {
        cout<<n-1<<' ';
        for(int i=2;i<=n-1;i++) 
        {
            cout<<(i^1)<<' ';
        }
        cout<<1<<endl;
    }
    else 
    {
        vi a={n};
        for(int i=2;i<=n-1;i++) a.push_back(i^1);
        a.push_back(1);
        int x=n-(1<<(__lg(n)));
        swap(a[x-1],a[0]);
        for(auto &ans:a) cout<<ans<<' ';
        cout<<endl;
    }
}

总结:还是出太慢了 但是这个b的题意确实非常模糊(肯定)

posted @ 2026-01-24 22:01  无限ovo  阅读(7)  评论(0)    收藏  举报