寒假牛客第六场

 

A-出题

题目描述

小B准备出模拟赛。
她把题目按难度分为四等,分值分别为6,7,8,9。
已知小B共出了m道题,共n分。
求小B最少出了多少道6分题。    

输入描述:

两个正整数n,m

输出描述:

一个数,表示答案。
若无解,输出"jgzjgzjgz"。

示例1

输入

复制

34 5

输出

复制

1

示例2

输入

复制

32 5

输出

复制

3

示例3

输入

复制

5 1

输出

复制

jgzjgzjgz

备注:

n,m≤1012
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
ll n,m;
int main()
{
    while(~scanf("%lld%lld",&n,&m)){
        if(n<6*m||n>9*m){
            printf("jgzjgzjgz\n");
            return 0;
        }
        if(n/m>=7){
            printf("0\n");
            return 0;
        }
        ll p=n/m;
        ll ans=n-p*m;
        printf("%lld\n",m-ans);
    }
}

B-煤气灶

题目描述

小j开始打工,准备赚钱买煤气灶。
第一天,小j的工资为n元,之后每天他的工资都比前一天多d元。
已知煤气灶需要m元,求小j最少工作几天才能买到煤气灶。

输入描述:

四个整数 n,m,d,x
分别表示小j第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过x

输出描述:

一个数表示答案

示例1

输入

复制

10 100 20 100

输出

复制

4

说明

10+30+50+70>=100

备注:

0≤n,d≤109,n+d>00≤n,d≤109,n+d>0
1≤m≤10181≤m≤1018
1≤x≤109
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
ll n,d,m;
int main()
{
    int x;
    while(~scanf("%lld%lld%lld%d",&n,&m,&d,&x)){
        if(n>=m){
            printf("1\n");
            return 0;
        }
        ll ans=n,t=1;
       while(ans

C-项链

题目描述

小B想给她的新项链染色。
现在有m种颜色,对于第i种颜色,小B有a_i单位的颜料,每单位颜料可以染项链的一个珠子;
同时,小B对于第i种颜色的喜爱度为b_i。
已知项链有n个珠子,求染色后每个珠子的颜色的喜爱度之和的最大值。
(每个珠子只能至多被染一次,不被染色则喜爱度为0)    

输入描述:

第一行两个数n,m
第二行m个数a_i
第三行m个数b_i

输出描述:

一个数表示答案

示例1

输入

复制

5 3
1 2 3
3 2 1

输出

复制

9

示例2

输入

复制

5 3
1 2 1
3 2 1

输出

复制

8

备注:

1≤n,m≤105,0≤ai,bi≤1061≤n,m≤105,0≤ai,bi≤106
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
ll n,m;
struct node
{
    ll a;
    ll b;
}p[N];
bool cmp(node x,node y)
{
    return x.b>y.b;
}
int main()
{
    while(~scanf("%lld%lld",&n,&m)){
        for(int i=1;i<=m;i++)
            scanf("%lld",&p[i].a);
        for(int i=1;i<=m;i++)
            scanf("%lld",&p[i].b);
            sort(p+1,p+1+m,cmp);
            int t=1;
            ll ans=0;
            while(n>0){
                if(n>=p[t].a){
                    n-=p[t].a;
                    ans+=p[t].a*p[t].b;
                }
                else {
                    ans+=p[t].b*n;
                    n-=p[t].a;
                }
                t++;
                if(t>m)
                    break;
            }
            printf("%lld\n",ans);
    }
}

 

D-美食

题目描述

小B喜欢美食。
现在有n个美食排成一排摆在小B的面前,依次编号为1..n,编号为i的食物大小为 a[i] ,即足够小B吃 a[i] 口。
小B每次会吃两口,这两口要么是编号相同的美食,要么是编号之差的绝对值为1的美食。
小B想知道,她最多能吃几次?

输入描述:

第1行一个正整数n,表示美食个数
接下来n行,第i行一个整数a[i],表示编号为i的美食的大小

输出描述:

一个数表示小B最多吃几次。

示例1

输入

复制

4
1
5
7
8

输出

复制

10

说明

用二元组(a,b)表示某一次吃的两个美食分别为第a个美食和第b个美食,则下面为一个吃10次的方案:
(1,2)(2,2)(2,2)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)
注意不一定要吃完。

备注:

 
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
int n,a[N];
ll ans;
int main()
{
    while(~scanf("%d",&n)){
        met(a,0);
        ans=0;
        for(int i=1;i<=n;i++)
            sc(a[i]);
        for(int i=1;i<=n;i++){
                if(a[i]==0)
                continue;
            if(a[i]%2==0)
                ans+=a[i]/2;
            else {
                if(a[i+1]==0){
                    ans+=a[i]/2;
                    continue;
                }
                ans+=a[i]/2+1;
                a[i+1]--;
            }
        }
        printf("%lld\n",ans);
    }
}

 G-区间或和

题目描述

求a|(a+1)|(a+2)|...|(b-1)|b。

 

其中|表示[按位或](https://baike.baidu.com/item/%E6%8C%89%E4%BD%8D%E6%88%96)。

输入描述:

多组输入,每行两个数表示a和b

输出描述:

对于每组输入,输出一个数a|(a+1)|(a+2)|...|(b-1)|b。

示例1

输入

复制

99 109
68 77
55 66
34 43
1111234 1114321

输出

复制

111
79
127
47
1179647

备注:

输入不超过10000行,0≤a,b≤10180≤a,b≤1018,a≤b
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define LL long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
LL a,b;
LL ans;
int main()
{
    while(~scanf("%lld%lld",&a,&b)){
          LL ans=0;
          bool flag=false;
          for(int i=62;i>=0;i--){
            LL tmp=1ll<

 

I-wzoi
 

题目描述

bleaves 最近在 wzoi 上面做题。
wzoi 的题目有两种,一种是 noip 题,一种是省选题。
bleaves 的做题方式很特别。每一天,她可能会看一道题目,这时她会选择题目种类,然后 wzoi 会在选定种类中随机扔给她一道她还没看过的题,她会把这道题看一遍,然后存在脑子里慢慢思考;她也有可能写题,这时她一定会写没写过的题中看的时间最迟的一题(如果不存在没写过的且没看过的题,她就不能写题)。
wzoi 每天会有一个推荐的题目种类,
如果 bleaves 看一道题目:如果种类和推荐的相同,那么这道题目最大得分为10,否则为5
如果 bleaves 写一道题目:如果种类和推荐的相同,那么这道题目得分为最大得分,否则为最大得分-5
假如 bleaves 现在还没看过任何一题,并且她知道了 wzoi 接下来一些天每天推荐的种类,问她在这些天的最大得分。

输入描述:

一行一个01串 s ,|s| 表示天数,si=0si=0 表示 wzoi 第 i 天推荐 noip 题, si=1si=1 表示 wzoi 第 i 天推荐省选题。

输出描述:

一行一个整数最大得分。

示例1

输入

复制

0011

输出

复制

20

说明

4天行动依次为:看一道 noip 题,写第1天看的题,看一道省选题,写第3天看的题。

示例2

输入

复制

0101

输出

复制

10

说明

4天行动依次为:看一道 noip 题,写第1天看的题,看一道noip题,写第3天看的题。

示例3

输入

复制

0110

输出

复制

20

说明

4天行动依次为:看一道 noip 题,看一道省选题,写第2天看的题,写第1天看的题。

备注:

全部的输入数据满足:1≤n≤1061≤n≤106 , n 为偶数。
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e6+10;
char s[N],t[N];
int ans;
int main()
{
    while(~scanf("%s",s)){
        int len=strlen(s);
        int tmp=0;
        ans=0;
        met(t,0);
        for(int i=0;i0){
                ans+=10;
                tmp--;
                continue;
            }
            t[++tmp]=s[i];
        }
        ans+=tmp/2*5;
        printf("%d\n",ans);
    }
}

J-迷宫

题目描述

你在一个 n 行 m 列的网格迷宫中,迷宫的每一格要么为空,要么有一个障碍。
你当前在第 r 行第 c 列(保证该格子为空)。每次移动你可以向上下左右任意一个方向移动一格,前提是不能走到障碍上,也不能超出迷宫的边界。
你向左移动的次数不能超过 x 次,向右不能超过 y 次。
问在这种情况下,对于每个格子,是否存在一种移动方案让你走到它。
输出有多少个格子存在移动方案让你走到它。

输入描述:

第一行两个正整数 n,m 。
第二行两个正整数 r,c ,保证 1≤r≤n1≤r≤n ,1≤c≤m1≤c≤m 。
第三行两个整数 x,y ,保证 0≤x,y≤1090≤x,y≤109 。
接下来 n 行,每行一个长度为 m 的字符串,
第 i 行第 j 个字符表示迷宫第 i 行第 j 列的格子,
字符为`.` 表示格子为空,字符为`*` 表示格子上有一个障碍。

输出描述:

输出一个数,表示有多少个格子存在移动方案让你走到它。

示例1

输入

复制

4 5
3 2
1 2
.....
.***.
...**
*....

输出

复制

10

说明

将能走到的格子用+标记:

+++..
+***.
+++**
*+++.

示例2

输入

复制

4 4
2 2
0 1
....
..*.
....
....

输出

复制

7

说明

.++.
.+*.
.++.
.++.

备注:

对于全部数据, 1≤n,m≤10001≤n,m≤1000 。
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int n,m,q,e,r,c,ans;
char a[1010][1010];
bool vis[1010][1010];
struct node
{
    int x,y,q,e;
    node(int x1,int y1,int q1,int e1) : x(x1),y(y1),q(q1),e(e1){}
};
queuequ;
int main()
{
    while(~scanf("%d%d%d%d%d%d",&n,&m,&r,&c,&q,&e)){
        for(int i=1;i<=n;i++){
                char p=getchar();
            for(int j=1;j<=m;j++)
                scanf("%c",&a[i][j]);
        }
        qu.push(node(r,c,q,e));
        ans=0;
        met(vis,0);
        while(!qu.empty()){
            node no=qu.front();
            qu.pop();
            if(vis[no.x][no.y]||a[no.x][no.y]=='*')
                continue;
                ans++;
            vis[no.x][no.y]=1;
            if(no.x1)
                qu.push(node(no.x-1,no.y,no.q,no.e));
            if(no.y>1&&no.q>0)
                qu.push(node(no.x,no.y-1,no.q-1,no.e));
            if(no.y0)
                qu.push(node(no.x,no.y+1,no.q,no.e-1));

        }
        printf("%d\n",ans);
    }
}

 

你可能感兴趣的:(搜索,图,训练)