牛客寒假(基礎)算法訓練營6

A 出題

鏈接:https://ac.nowcoder.com/acm/contest/332/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

思路

數學題,顯然,有解的充要條件爲 6m≤n≤9m若有解:設有 x(0≤x≤m) 道6分題,則剩下的m-x題共n-6x分,剩下的題有解的充要條件爲 7(m−x)≤n−6x≤9(m−x)解得 7m−n≤x≤(9m−n)/3。,因此答案爲max(0,7m-n)。

代碼

#include<stdio.h>
#define max(a,b) a>b?a:b
int main()
{
    long long int n,m,a,b;
    scanf("%lld%lld",&n,&m);
    a=7*m-n;b=0;
    if(n>9*m||n<6*m)
        printf("jgzjgzjgz");
    else
        printf("%lld",max(a,b));
    return 0;
}

B  煤氣竈

鏈接:https://ac.nowcoder.com/acm/contest/332/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<stdio.h>
int main()
{
	long long int n,m,d,x,s=0,i;
	scanf("%lld%lld%lld%lld",&n,&m,&d,&x);
	for(i=1;i<=x;i++)
	{
		s+=n;
		n+=d;
		if(s>=m) break; 
	}
	printf("%lld",i);
	return 0; 
}

C 項鍊

鏈接:https://ac.nowcoder.com/acm/contest/332/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≤106

思路

簽到題,簡單貪心,排序就OK了,但比賽我使用C語言qsort超時很煩,c++不是很好沒做嗚嗚嗚

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct p{
    ll a;
    ll b;
}mp[100005];
bool cmp(p x,p y){
    return x.b>y.b;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%lld",&mp[i].a);
    }
    for(int i=0;i<m;i++){
        scanf("%lld",&mp[i].b);
    }
    sort(mp,mp+m,cmp);
    ll sum=0;
    for(int i=0;i<m;i++){
        if(n>=mp[i].a){
            sum+=(mp[i].a*mp[i].b);
            n-=mp[i].a;
        }
        else{
            sum+=(mp[i].b*n);
            n=0;
        }
        if(n==0) break;
    }
    printf("%lld\n",sum);
}

 

D 美食

鏈接:https://ac.nowcoder.com/acm/contest/332/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)
注意不一定要吃完。

備註:


思路

假設能吃的次數是連續的(即中間不存在a[i]=0),他就相當於吃的次數爲總和/2(偶數吃完奇數剩一個) 。但是如果加上這個條件,可以認爲食物分成了若干份,而我現在需要統計每一小份所需吃的次數的加和,即當a[i]=0時表示這一份我吃完了需要停一下但我還有食物要等我把這次吃的食物消化完再繼續吃(sum=0&&ans+=這一段吃的次數)

代碼

#include<stdio.h>
int main()
{
    long long int n,t,ans=0,sum=0;
    scanf("%lld",&t);
    while(t--)
    {
    	scanf("%lld",&n);
    	if(n==0)
    		ans+=sum/2,sum=0;
    	sum+=n;
    }
    printf("%lld",ans+sum/2);
    return 0;
}

E 海嘯

鏈接:https://ac.nowcoder.com/acm/contest/332/E

題目描述

有一個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔爲h[i][j]。
由於沿海,所以這個地區經常會發生海嘯。
海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到d,因此海拔低於d的城市都會被淹沒。
現在有q次詢問,每次問你一個矩形區域中,有多少城市不會被淹沒。

輸入描述:

第一行三個整數n,m,d,具體含義見題目描述。
接下來n行,每行m個整數,其中第i行第j列的整數爲h[i][j],具體含義見題目描述。
第n+2行一個整數q,表示詢問數。
接下來q行,每行四個整數a,b,x,y,
表示詢問從第a行第b列到第x行第y列的矩形地區中,有多少地區不會被淹沒。
即有多少個i,j,滿足 a≤i≤x,b≤j≤ya≤i≤x,b≤j≤y ,且 h[i][j]≥dh[i][j]≥d 。

輸出描述:

共q行,第i行一個整數,表示第i個詢問的答案。

示例1

輸入

3 3 3
1 2 3
2 1 5
4 3 2
2
1 2 2 3
2 1 3 3

輸出

2
3

備註:

1≤n×m≤1061≤n×m≤106
1≤q≤1051≤q≤105
0≤d,h[i][j]≤1090≤d,h[i][j]≤109
1≤a≤x≤n,1≤b≤y≤m

思路

代碼

F 石頭剪刀布

鏈接:https://ac.nowcoder.com/acm/contest/332/F
來源:牛客網
 

題目描述

wzms 今年舉辦了一場剪刀石頭布大賽,bleaves 被選爲負責人。
比賽共有 2n2n 個人參加, 分爲 n 輪,
在每輪中,第 1 位選手和第 2 位選手對戰,勝者作爲新的第 1 位選手,
第 3 位和第 4 位對戰,勝者作爲新的第 2 位選手,以此類推。
bleaves 調查得知,每個人都有其偏愛決策,每個人在每一次對戰中都會使用他的偏愛決策。
如果一次對戰的雙方的偏愛決策相同,那麼這次對戰就永遠不會結束,所以 bleaves 不希望這種情況發生。
現在 bleaves 知道了每個人的偏愛決策,但她不知道如何安排初始的次序,使得上面的情況不會發生,你能幫幫她嗎?

輸入描述:

一行三個整數 R,P,S ,表示偏愛石頭,布,剪刀的人數分別爲 R,P,S 。

輸出描述:

如果無解,輸出 `IMPOSSIBLE` ;
否則輸出一個長度爲 R+P+S 的字符串,第 i 個字符表示初始時第 i 位選手的偏愛決策,
如果有多種方案,輸出字典序最小的。

示例1

輸入

1 1 0

輸出

PR

說明

只有 2 個選手,一個偏愛石頭,一個偏愛布,無論次序如何,偏愛布的選手都會勝出。

所以方案可以是 PR 和 RP ,其中字典序最小的 PR 。

示例2

輸入

2 0 0

輸出

IMPOSSIBLE

示例3

輸入

1 1 2

輸出

PSRS

備註:

全部的輸入數據滿足:R+P+S=2nR+P+S=2n ,1≤n≤20

思路

代碼

G 區間或和

鏈接:https://ac.nowcoder.com/acm/contest/332/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

思路

位運算不懂

找規律

   其中出現了很多個相同的數,如果把這些重複的數省去,時間複雜度就會降低很多,其實列出來以後就能發現當一個數按位或一個比它大的數的時候它纔會變,所以我們對於a和b,依次枚舉ans按位或ans+1,直到大於等於b就好了。其實原理也很簡單,對於一個數按位或一個比它大1的數,根據按位或的性質,其實就是在這個數的最高位前加一個1。

---------------------

原文:https://blog.csdn.net/Charles_Zaqdt/article/details/86754296

代碼

#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
int main()
{
  ll a,b;
  while(scanf("%lld%lld",&a,&b) != EOF){
    if(a == b){
      printf("%lld\n", a);
      continue;
    }
    ll ans = a | (a + 1);
    while(ans < b){
      ans |= (ans + 1);
    }
    printf("%lld\n", ans);
  }
  return 0;
}

H 肥豬

鏈接:https://ac.nowcoder.com/acm/contest/332/H

題目描述

小B來到了一個異世界,成爲了肥豬之王。
在這個異世界,共有n種肥豬,編號分別爲1,...,n。
小B希望集齊這n種肥豬。
召集肥豬有兩種方式:
1. 花費a[i]的金幣召喚一隻編號爲i的肥豬。
2. 花費x的金幣使所有已召集的肥豬進化。
即編號爲i的肥豬編號變成i+1,特殊的,編號爲n的肥豬編號變成1。

請問小B最少要花多少金幣才能集齊n種肥豬。    

輸入描述:

第一行兩個正整數n,x
接下來n行,第i行一個正整數a[i]

輸出描述:

一個數表示答案

示例1

輸入

2 10
1
20

輸出

12

示例2

輸入

4 10
1
2
3
4

輸出

10

備註:

1≤n≤2000,1≤x,a[i]≤109

思路

代碼

I wzoi

鏈接:https://ac.nowcoder.com/acm/contest/332/I

題目描述

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 爲偶數。

思路

代碼

J 迷宮

鏈接:https://ac.nowcoder.com/acm/contest/332/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 。

思路

代碼

 

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