牛客周赛 Round65 补题DEF

目录

D.医生

E.降温(easy))

F.降温(hard)


D.医生

思路:从范围来看m和k,可知我们可以将每一个字符串看成一个二进制数,将他们转换成十进制后,进行深度搜索,每种药有可选或不选两种情况,当搜到最后一种药时,我们只需将病人的十进制数与我们所选的药所组成的十进制数进行与运算,若最后结果与病人的十进制数相等,则说明我们所选的药包含病人的这些病,然后我们可以再加个剪枝,如果当前选的药数已经大于目前的最小值可以直接回溯。

Code:

cpp 复制代码
int n,m,ans;
int medicine[15],people[10005],k;

void dfs(int depth,int num,int medi,int id)
{
    if(num>=ans) return ;
    if(depth==k+1)
    {
        if((medi&people[id])==people[id]) 
        {
            ans=min(ans,num);
        }
        return ;
    }

    dfs(depth+1,num+1,medi|medicine[depth],id);
    dfs(depth+1,num,medi,id);

    return ;
}
void solve()
{
   cin>>n>>m;
   for(int i=1;i<=n;i++)
   {
    for(int j=1;j<=m;j++)
    {
        char c;cin>>c;
        int x=c-'0';
        if(x)
        {
            people[i]|=(1<<(m-j));
        }
    }
   }

   cin>>k;
   for(int i=1;i<=k;i++)
   {
    for(int j=1;j<=m;j++)
    {
        char c;cin>>c;
        int x=c-'0';
        if(x)
        {
            medicine[i]|=(1<<(m-j));
        }
    }
   }

   for(int i=1;i<=n;i++)
   {
       ans=1e18;
       dfs(1,0,0,i);
       if(ans==1e18) cout<<-1<<endl;
       else cout<<ans<<endl;
   }
}

E.降温(easy)

思路:贪心,只有当前一项比后一项大于等于x的时候才算寒潮,所以如果要使寒潮天数最大,我们要尽可能使ai变大,这样ai-ai+1>=x的概率才更大,如果第一个数为-999,则a1=50,其他数如果ai!=-999,ai-1-ai>=x则寒潮天数+1,如果ai=-999,若ai-1-x>=-50,则当ai=ai-1-x时寒潮天数增加,反之ai=50。求最小天数也一样,我们尽可能使ai-1-x超过-50这个边界,即ai尽可能小。

Code:

cpp 复制代码
constexpr int N=1005,mod=998244353;

int a[N],b[N],n,x;

void solve()
{
   cin>>n>>x;
   int ma=0;
   for(int i=1;i<=n;i++)
   {
    cin>>a[i];
    b[i]=a[i];
    if(i==1)
    {
        if(a[i]==-999)
        a[i]=50;
        continue;
    }
    if(a[i]!=-999)
    {
        if(a[i-1]-a[i]>=x)
            ma++;
    }
    else
    {
        if(a[i-1]-x>= -50) 
        {
            ma++;
           a[i]=a[i-1]-x;
        }
        else a[i]=50; 
    }  
   }
   cout<<ma<<' ';
   int mi=0;
   for(int i=1;i<=n;i++)
   {
    if(i==1)
    {
        if(b[i]==-999)
        b[i]=-50;
        continue;
    }
    if(b[i]!=-999)
    {
        if(b[i-1]-b[i]>=x) mi++;
    }
    else
    {
        if(b[i-1]-x >= -50)
        {
            b[i]=b[i-1]-x+1;
        }
        else b[i]=-50;
    }
   }
   cout<<mi;
}

F.降温(hard)

思路:与E题思路一样,改下数据范围即可。

Code:

cpp 复制代码
constexpr int N=1e5+5,mod=1e9+7,spj=-999999999;
constexpr int minn=-5*1e8,maxn=5*1e8;
int a[N],b[N],n,x;

void solve()
{
  cin>>n>>x;
  int ma=0;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    b[i]=a[i];
    if(i==1)
    {
        if(a[i]==spj)
        {
            a[i]=maxn;
        }
        continue;
    }
    if(a[i]!=spj)
    {
        if(a[i-1]-a[i]>=x) ma++;
    }
    else
    {
        if(a[i-1]-x>=minn)
        {
            a[i]=a[i-1]-x;
            ma++;
        }
        else a[i]=maxn;
    }
  }
  cout<<ma<<' ';
  int mi=0;
  for(int i=1;i<=n;i++)
  {
    if(i==1)
    {
        if(b[i]==spj)
            b[i]=minn;
        continue;
    }
    if(b[i]!=spj)
    {
        if(b[i-1]-b[i]>=x)
            mi++;
    }
    else
    {
        if(b[i-1]-x>=minn) b[i]=b[i-1]-x+1;
        else b[i]=minn;
    }
  }
  cout<<mi;
}
相关推荐
统计学小王子6 分钟前
数学建模国赛倒计时4天——《统计模型精讲(混合效应模型R语言实现)》
开发语言·数学建模·r语言
知无不研10 分钟前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴15 分钟前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅25 分钟前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
dsyyyyy110133 分钟前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
a187927218311 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_962297482 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”2 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
辰烨chenye2 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
辰烨chenye2 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode