寒假牛客第六場

有點事,先貼代碼,題解回來再寫。。

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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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<m){
            n=n+d;
        ans+=n;
        t++;
       }
       printf("%lld\n",t);
    }
}

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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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;
map<ll,ll>mp;
ll a,b;
ll ans;
void solve(ll x)
{
    while(x>0){
       if(mp[lowbit(x)]==0){
        mp[lowbit(x)]++;
        ans+=lowbit(x);
        }
        x-=lowbit(x);
    }
}
int main()
{
    while(~scanf("%lld%lld",&a,&b)){
         ans=0;
        mp.clear();
        for(ll i=b;i>=a;i--)
            solve(i);
            printf("%lld\n",ans);
    }
}

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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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;i<len;i++){
            if(t[tmp]==s[i]&&tmp>0){
                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<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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){}
};
queue<node>qu;
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.x<n)
                qu.push(node(no.x+1,no.y,no.q,no.e));
            if(no.x>1)
                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.y<m&&no.e>0)
                qu.push(node(no.x,no.y+1,no.q,no.e-1));

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章