1
希望对你有帮助.|

zouyua

园龄:1年10个月粉丝:3关注:3

cf 870div2 abcd题解

A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立

复制代码
#include<iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;
const ll INF=0x3f3f3f3f;
const int N=1e4+10;
int h[N];
ll res;
void solve()
{
    int n;
    cin>>n;
    int res=0;
    int f=0;
    for(int i=0;i<n;i++) cin>>h[i];
    
    while(res<n)
    {
        int ans=0;
        for(int i=0;i<n;i++)
        {
            if(res<h[i])
                ans++;
        }
    if(res==ans)
    {
        cout<<res<<endl;
        return;
    }
    res++;
        //cout<<res<<' ';
    }
    //if(res==n)
        cout<<-1<<endl;
}
复制代码

B题,ai%x=a(n+1-i)%x等价于(ai-a(n+1-i))%X=0(同余定理)即差是x的倍数,0%任何数等于任何数,因为求最大的x即遍历所有的满足gcd

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair<int,int> PII;
const ll INF=0x3f3f3f3f;
const int N=1e5+10;
ll h[N];
void solve()
{
    int n;
    cin>>n;
    ll res=0;
    for(int i=1;i<=n;i++) cin>>h[i];
    for(int i=1;i<=n;i++)
    {
        res=__gcd(res,abs(h[i]-h[n+1-i]));
    }
    cout<<res<<endl;
}
复制代码

 C题分情况讨论,最后在n>m时发现,只要n的最小质因子大于m时无论如何分都可以,其他都不行(注意找最小值因子的写法)

复制代码
void solve()
{
    int n,m;
    cin>>n>>m;
    if(m==1||n==1)
    {
        cout<<"yes"<<endl;
    }
    else if(n<=m)
    {
        cout<<"no"<<endl;
    }
    else
    {
        for(int i=2;i<=m&&i<=n/i;i++)
        {
            if(n%i==0)
            {
                cout<<"no"<<endl;
                return;
            }
        }
 
        cout<<"yes"<<endl;
    }
}
复制代码

D题,转化为b1+l,b2,b3-r即分别求各项的最大值,三元方程一般从中间下手,前后两项都和i有关,可以先求出前后缀最大值,最后从中间b2入手
(注意后缀从后面入手,因为是递推的)

复制代码
 1 void solve()
 2 {
 3     int n;
 4     cin>>n;
 5     ll res=-1e6;
 6     for(int i=1;i<=n;i++) cin>>a[i];
 7     for(int i=1;i<=n;i++) y[i]=a[i]+i;
 8     for(int i=n;i>=1;i--) s[i]=a[i]-i;
 9     for(int i=1;i<=n;i++) y[i]=max(y[i-1],y[i]);
10     for(int i=n-1;i>=1;i--) s[i]=max(s[i+1],s[i]);
11     for(int i=2;i<=n-1;i++)
12         res=max(res,a[i]+y[i-1]+s[i+1]);
13     cout<<res<<endl;
14 }
复制代码

 

本文作者:zouyua

本文链接:https://www.cnblogs.com/ZouYua/p/17396502.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   zouyua  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起