牛客寒假算法基础集训营6(补题)

题目地址

https://ac.nowcoder.com/acm/contest/332#question

吐槽

牛客比赛的数据与数据范围的规定真是太毒瘤了。。。。

A 出题(数学)

真的上来一个下马威啊

什么情况下会无解首先好想的就是6*m如果不够这个数那么无解

坑点①9*m不好想

wa在9*m上的确实有些可惜了

坑点②用LL(这个对于牛客来说不算坑点了)

7m-n怎么推出来的?

这个地方实际上也可以简单的进行推出

首先我们在已经有解的基础上,把每个题先赋值成6分

那么当前剩余的分数就是n-6*m

这里我们需要贪心的想一下如果要保证6最少,那么应该让7分题尽量的多

因为这样会使除了6之外的分数平摊从而使平摊到6上面的最少

所以最终答案是m-(n-6m)=7m-n

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n,m;
  cin>>n>>m;
  if(n>=6*m&&n<=9*m)
  cout<<max(0LL,7*m-n);
  else
  cout<<"jgzjgzjgz";
}

B 煤气灶(暴力or数学)

这题上来一个广播说x没有任何作用可以不看,但是x是有作用的,他的作用就是限制了答案的大小

但是反过来讲我要是有一组数据1 1e18 1 1e9那么肯定没法得出正确答案因为题目要求最大答案是1e9

所以这题相当毒瘤

毒瘤①推公式必须想到d=0的情况,如果没有的话会while(1) cout<<"wa\n";

毒瘤②题目本身就有问题,既然m=1e18答案又是最大1e9那么肯定会有根本做不出来的数据,但是这个数据又不能出

毒瘤③广播说x没有用,信了就得去推公式,推公式不一定想到d=0

暴力解法

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n,m,d,x,ans=1,sum=0;
  cin>>n>>m>>d>>x;
  sum=n;
  while(sum<m)
  {
    ans++;
    n+=d;
    sum+=n;
  }
  cout<<ans;
}

公式解法(看牛客代码即可)

C 项链(贪心)

容易想复杂,就是按照单价高的降序排列贪心即可

代码

#include <bits/stdc++.h>
using namespace std;
long long sum;
struct node
{
  long long a,b;
}num[100005];
bool cmp(node a,node b)
{
  return a.b>b.b;
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n,m;
  cin>>n>>m;
  for(int i=0;i<m;i++)
  cin>>num[i].a;
  for(int i=0;i<m;i++)
  cin>>num[i].b;
  sort(num,num+m,cmp);
  for(int i=0;i<m;i++)
  {
    if(num[i].a>=n)
    {
      sum+=n*num[i].b;
      break;
    }
    else
    sum+=num[i].a*num[i].b,n-=num[i].a;
  }
  cout<<sum;
}

D 美食(贪心)

也很毒瘤啊,数据有0

最初得出一个简单的做法就是总数/2但是有0那么就不行

把0分割出来分别计算两部分即可

为什么总数/2就行?

因为如果和是偶数那么一定会能全部拿走,和是奇数一定会有剩余1个

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long sum=0,ans=0,n,t;
  cin>>n;
  while(n--)
  {
    cin>>t;
    if(t==0)
    ans+=sum/2,sum=0;
    sum+=t;
  }
  cout<<ans+sum/2;
}

E 海啸(二维dp?)

太毒瘤了活久见n*m<=1e6这个数据范围的设定

当时没过就是这个地方,直接卡掉了。。。。

就算二维都是9999也是不对

不对也不提示re数组开小提示wa

直接多浪费好多时间de不存在的bug

说是要动态数组实际上就是用一种我觉得只有这一类题才会出现的变量定义数组即可

不多说了这个题之前出过一个更难的。。。

就是区间加加减减

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,m,d;
  cin>>n>>m>>d;
  int mp[n+5][m+5],dp[n+5][m+5];
  memset(mp,0,sizeof(mp));
  memset(dp,0,sizeof(dp));
  for(int i=1;i<=n;i++)
  for(int j=1;j<=m;j++)
  cin>>mp[i][j];
  for(int i=1;i<=n;i++)
  for(int j=1;j<=m;j++)
  {
    if(mp[i][j]>=d)
    dp[i][j]++;
    dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
  }
  int q;
  cin>>q;
  while(q--)
  {
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    cout<<dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]<<"\n";
  }
}

F 石头剪刀布(不明)

待填坑

G 区间或和(数学)

答案是如果a<b一直重复a|=(a+1)

我也不是很清楚为什么。。。。

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long a,b;
  while(cin>>a>>b)
  {
    while(a<b)
    a|=(a+1);
    cout<<a<<"\n";
  }
}

H 肥猪(不明)

待填坑

I wzoi(数据结构)

题目很长很难理解实际上还是考的stack

这个题我之前做过一个cf的相似的题,不知道是不是出题人直接改编的那个题

那个cf题是 cf 534div2 B Game with string

实际上就是凑看看有没有能正好看的就是学的不行的话加上凑不上的即可

代码

#include <bits/stdc++.h>
using namespace std;
stack<char> st;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string a;
  long long sum=0,ans=0;
  cin>>a;
  for(int i=0;i<a.size();i++)
  {
    if(st.size()&&a[i]==st.top())
    {
      sum++;
      ans+=10;
      st.pop();
    }
    else
    st.push(a[i]);
  }
  if(sum*2==a.size())
  cout<<ans;
  else
  cout<<ans+(a.size()/2-sum)*5;
}

J 迷宫(搜索)

当时手贱用了dfs结果崩溃,好久没搜索今天复习了一下发现应该用bfs好一点虽然写的多,但是思路清晰

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  int x,y;
};
struct nodd
{
  int l,r;
}now[1005][1005];
int mk[1005][1005],bk[1005][1005];
char mp[1005][1005];
int dx[6]={-1,1,0,0};
int dy[6]={0,0,-1,1};
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,m,sx,sy,l,r,sum=0;
  cin>>n>>m>>sx>>sy>>l>>r;
  for(int i=1;i<=n;i++)
  for(int j=1;j<=m;j++)
  cin>>mp[i][j];
  queue<node> q;
  q.push((node){sx,sy});
  bk[sx][sy]=1;
  now[sx][sy]=(nodd){l,r};
  while(q.size())
  {
    node p=q.front();
    q.pop();
    mk[p.x][p.y]=1;
    for(int i=0;i<4;i++)
    {
      int xx=p.x+dx[i];
      int yy=p.y+dy[i];
      if(xx<=0||yy<=0||xx>n||yy>m||bk[xx][yy]||mp[xx][yy]=='*')
      continue;
      if(dy[i]==-1&&now[p.x][p.y].l==0)
      continue;
      if(dy[i]==1&&now[p.x][p.y].r==0)
      continue;
      if(dy[i]==-1)
      {
        q.push((node){xx,yy});
        now[xx][yy]=(nodd){now[p.x][p.y].l-1,now[p.x][p.y].r};
        bk[xx][yy]=1;
      }
      else if(dy[i]==1)
      {
        q.push((node){xx,yy});
        now[xx][yy]=(nodd){now[p.x][p.y].l,now[p.x][p.y].r-1};
        bk[xx][yy]=1;
      }
      else
      {
        q.push((node){xx,yy});
        now[xx][yy]=(nodd){now[p.x][p.y].l,now[p.x][p.y].r};
        bk[xx][yy]=1;
      }
    }
  }
  for(int i=1;i<=n;i++)
  for(int j=1;j<=m;j++)
  if(mk[i][j])
  sum++;
  cout<<sum;
}

猜你喜欢

转载自www.cnblogs.com/baccano-acmer/p/10350783.html