今日学习总结

试题 算法训练 矮人采金子

提交此题   评测记录  

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  矮人们发现了 N 个新的金矿。据测算,开采第 i 个金矿会带来 Ai 个金币的收入。但是,开采一个金矿本身需要花费 1000 个金币来开挖隧道。矮人们可以选择是否开采每个金矿。他们想知道,通过合理的选择,他们最多可以有多少个金币的净收入。你能回答他们的问题吗?

输入格式

  第一行包含一个正整数 N 。(1 ≤ N ≤ 100)。
  第二行为 N 个用空格隔开的非负整数,其中第 i 个数表示 Ai,每个数
  不超过 10000。

输出格式

  输出仅一行,只包含一个数字,即矮人们所能获得的最高的净收入。

样例输入

4
2012 999 1481 23

样例输出

1493

思路:简单题,就是比较大小,再进行计算的问题。

#include <iostream>
using namespace std;

int main() {
    int n,sum=0;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
    {
      cin>>a[i];
      if(a[i]>1000)
       sum=sum+a[i]-1000;
    }
     cout<<sum;
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

浮云阴,骤雨倾,顽皮恶魔镰刀显。

你的庄园是一块 n×mn\times mn×m 的草坪。


现在有一些格子是普通植物 P\tt PP,有一些格子是萝卜保护伞 ∗\tt *∗,有一些格子是僵尸 Z\tt ZZ。(已经在格子上的僵尸不会吃掉植物或移动)

tip:萝卜保护伞可以保护周围 3×33\times33×3 的植物,即一个位于位置 (x,y)(x,y)(x,y) 的萝卜保护伞可以保护位于 (x±1,y),(x,y±1),(x±1,y±1)(x\pm1,y),(x,y\pm1),(x\pm1,y\pm1)(x±1,y),(x,y±1),(x±1,y±1) 八个格子上的植物。

现在你想知道,对于这样一块给定的草坪,假设有无穷多个飞贼,能够偷走最多数量的植物是多少。

输入描述:

全文第一行输入一个正整数 T(1≤T≤105)T(1\le T\le10^5)T(1≤T≤105),表示数据组数。

每组数据第一行输入两个正整数 n,m(1≤n,m≤103)n,m(1\le n,m\le10^3)n,m(1≤n,m≤103),表示草坪的长和宽。

接下来输入一个 n×mn\times mn×m 的字符矩阵表示草坪的大小,字符矩阵中仅包含 Z\tt ZZ、P\tt PP、∗\tt *∗ 三种字符。

数据保证 ∑n×m≤2×106\sum n\times m\le2\times10^6∑n×m≤2×106

输出描述:

每行输出一个整数表示最多被偷走的植物数量。

示例1

输入

复制1 5 5 ZPZPZ P*PZP ZPZPZ PZPZP ZP*PZ

1
5 5
ZPZPZ
P*PZP
ZPZPZ
PZPZP
ZP*PZ

输出

复制5

5

说明

 

分别位于 (2,2)(2,2)(2,2) 和 (5,3)(5,3)(5,3) 上的保护伞可以保护周围的植物,最后能被偷走的植物如下图所示:(#\## 表示即将被偷走,∗\tt *∗ 表示保护伞,P\tt PP 表示被保护)

肉眼可见最后有分别位于 (1,4),(2,5),(3,4),(4,1),(4,5)(1,4),(2,5),(3,4),(4,1),(4,5)(1,4),(2,5),(3,4),(4,1),(4,5) 的五株被偷走。

思路:想到咋处理比较简单就是要过的话,要多想点,就是找到P,然后判断它周围是否有‘ * ’,就可以了,只要就是,每次弄完之后要去除之前的赋值(对于这点我不想说啥了)

#include <iostream>
#include <stdio.h>
#include <cstdio>
using namespace std;
const int maxn=1009;
char a[maxn][maxn];
int cnt,g=0;
void bfs(int x,int y)
{
    if(a[x][y+1]=='*'||a[x][y-1]=='*'||a[x+1][y]=='*'||a[x-1][y]=='*'||a[x+1][y+1]=='*'||a[x-1][y+1]=='*'||a[x+1][y-1]=='*'||a[x-1][y-1]=='*')
        g=1;
    else
       g=0;
}

int main() {
    int t;
    cin>>t;
    while(t--)
    {
        cnt=0;
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(a[i][j]=='P')
                {
                    g=0;
                    bfs(i,j);
                    if(g==0)
                    cnt++;
                }
            cout<<cnt<<endl;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
               a[i][j]='0';
            }
        }
    }
    return 0;
}
 

试题 算法训练 接水问题

提交此题   评测记录  

资源限制

时间限制:1.0s   内存限制:64.0MB

问题描述

  学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m, 则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入格式

  第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。 第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同 学的接水量。

输出格式

  输出只有一行,1 个整数,表示接水所需的总时间。

样例输入

Sample Input1:
5 3
4 4 1 2 1

Sample Input2:
8 4
23 71 87 32 70 93 80 76

样例输出

Sample Output1:
4

Sample Output2:
163

输入输出样例 1 说明

  第1 秒,3 人接水。第1 秒结束时,1、2、3 号同学每人的已接水量为1,3 号同学接完
  水,4 号同学接替3 号同学开始接水。
  第2 秒,3 人接水。第2 秒结束时,1、2 号同学每人的已接水量为2,4 号同学的已接
  水量为1。
  第3 秒,3 人接水。第3 秒结束时,1、2 号同学每人的已接水量为3,4 号同学的已接
  水量为2。4 号同学接完水,5 号同学接替4 号同学开始接水。
  第4 秒,3 人接水。第4 秒结束时,1、2 号同学每人的已接水量为4,5 号同学的已接
  水量为1。1、2、5 号同学接完水,即所有人完成接水。
  总接水时间为4 秒。

数据规模和约定

  1 ≤ n ≤ 10000,1 ≤m≤ 100 且m≤ n;
  1 ≤ wi ≤ 100。

思路:就是在接水的数组中找到最小的那个,后面等的代替最小的位置,最后找到接水口最多的位置,输出接的水就是时间。

链接https://blog.csdn.net/weixin_52834435/article/details/122586590

#include <iostream>

using namespace std;
int a[10005];
int n,m,num;
int maxn=-1;
int main() {
    cin>>n>>m;
     for(int i=1;i<=n;i++)
     {
         cin>>a[i];
     }
     for(int i=m+1;i<=n;i++)
     {
         int minx=1000000;
         for(int j=1;j<=m;j++)
         {
             if(minx>a[j])
             {
                 minx=a[j];
                 num=j;
             }
         }
         a[num]+=a[i];
     }
     for(int i=1;i<=m;i++)
     {
         if(a[i]>maxn)
         maxn=a[i];
     }
     cout<<maxn;
    return 0;
}
 

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

妞妞听说Nowcoder Girl女生编程挑战赛要开始了, 但是她没有足够的勇气报名参加, 牛牛为了帮助妞妞,给她准备一台勇气获得机。初始的时候妞妞的勇气值是0, 勇气获得机有两个按钮:

1、N按钮: 如果当期拥有的勇气值为x, 按下之后勇气值将变为2*x+1,

2、G按钮: 如果当前拥有的勇气值为x, 按下之后勇气值将变为2*x+2,

勇气值过高也会膨胀,所以妞妞需要将自己的勇气值恰好变为n, 请你帮助她设计一个勇气获得机的按键方案使妞妞的勇气值恰好变为n。

输入描述:

输入包括一行, 包括一个正整数n(1 <= n <= 10^9), 表示妞妞最后需要的勇气值。

输出描述:

输出一行字符串, 每个字符表示该次妞妞选择按动的按钮,'N'表示该次按动N按钮,'G'表示该次按动G按钮。

示例1

输入

复制20

20

输出

复制NGNG

NGNG

思路:就是奇数偶数问题吧,逆向来做会简单些

#include <iostream>

using namespace std;


int main() {
   long long n;
    cin>>n;
    char a[10005];
    int k=0;
    while(n)
    {
        if(n%2==0)
        {
            n=(n-2)/2;
            a[k++]='G';
        }
        else
        {
            n=(n-1)/2;
            a[k++]='N';
        }
    }
    for(int i=k-1;i>=0;i--)
    cout<<a[i];
    
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

 

一天小A在金色的银杏树下向他喜欢的小姐姐B表白了,“对不起,我喜欢的是C”,B这样说道,小A尴尬的笑了笑转身离开了。他心里默默说着“对不起,C喜欢我。”(233333333)

Love triangle被定义为:如果A喜欢B,B喜欢C,C喜欢A则称为Love triangle。现在让你寻找有没有Love triangle。

输入描述:

 

第一行一个正整数N(n<=5000),第二行n个数X1,X2,X3……Xn代表i喜欢Xi。

输出描述:

如果存在Love triangle则输出YES,没有则输出NO。

示例1

输入

复制5 2 4 5 1 3

5
2 4 5 1 3

输出

复制YES

YES

思路:就是走三次,看最后是否又回到原来位置

#include <iostream>

using namespace std;


int main() {
    int n;
    cin>>n;
    int a[5001];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        int b,c,d;
        b=a[i];
        c=a[b];
        d=a[c];
        if(b==d)
        {
            cout<<"YES";
            return 0;
        }
    }
    cout<<"NO";
    return 0;
}

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

    小Q挺喜欢撸串的,没错,字符串!

    你给小Q送上了n个字符串

    对于一个字符串s,如果在小Q撸掉(删除)任意个字符之后,"NowCoder"是其子串,则这个字符串s是可撸的。小Q最近切题切到手软,想撸串散散心。如果你给他呈现的字符串是可撸的,他会很开心,否则他会很桑心。

输入描述:

一个整数n,表示字符串的数量 

接下来每行一个字符串sis_isi​,表示小Q看到的第i个字符串

输出描述:

输出有n行,如果小Q开心他会说QAK,否则他会说QIE

示例1

输入

复制2 ​NowCoder ​NoowCoder

2
​NowCoder
​NoowCoder

输出

复制QAK QAK

QAK
QAK

说明

第一个字符串不需要撸掉任何字符
第二个字符串撸掉第二个或者第三个都可以

示例2

输入

复制5 ​Nowcoder ​nowcoder ​NowCoder ​NowoowCoder ​NOI2019NowCoder

5
​Nowcoder
​nowcoder
​NowCoder
​NowoowCoder
​NOI2019NowCoder

输出

复制QIE QIE QAK QAK QAK

QIE
QIE
QAK
QAK
QAK

备注:

对于50%50\%50%的数据,满足n=1,1≤∣Si∣≤10n=1 , 1\leq |S_i|\leq 10n=1,1≤∣Si​∣≤10
对于100%100\%100%的数据,满足n≤105,1≤∣si∣≤100n\leq 10^5 , 1\leq|s_i|\leq 100n≤105,1≤∣si​∣≤100

思路:字符串的比较,先比较字长,在比较字符

#include <iostream>
#include <string.h>
using namespace std;


int main() {
    int n;
    cin>>n;
    char a[10]="NowCoder";
    char s[102];
    while(n--)
    {
       gets(s);
       int m;
       m=strlen(s);
       if(m==8&&strcmp(s,a)==0)
       cout<<"QAK"<<endl;
       else if(m==8&&strcmp(s,a)!=0)
       cout<<"QIE"<<endl;
       else if(m>8)
       {
           int j=0;
           for(int i=0;i<m;i++)
               if(a[j]==s[i])
                   {
                       if(j==8)
                       break;
                   j++;       
                   }
        if(j==8)
        cout<<"QAK"<<endl;
        else
        cout<<"QIE"<<endl;
        }
               
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值