*牛客集训营第六场补题(未完结)

题目链接:

题号 标题 已通过代码
A 出题 点击查看
B 煤气灶 点击查看
C 项链 点击查看
D 美食 点击查看
E 海啸 点击查看
F 石头剪刀布 点击查看
G 区间或和 点击查看
H 肥猪 点击查看
I wzoi 点击查看
J 迷宫 点击查看

A:思维

题目描述

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

输入描述:

两个正整数n,m

输出描述:

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

输入

34 5

输出

1

输入

32 5

输出

3

输入

5 1

输出

jgzjgzjgz

备注:

n,m1012

描述说明:

m道题n分,n/m>9||n/m<6  无解  ;只有用7还太大的时候才会用6,所以再判断m*7比总分大,说明要用6代替7,所以大多少就用多少6代替多少7;否则7,8,9就可以,输出0;

#include<iostream>
using namespace std;
int main()
{
	long long n, m;
	cin >> n >> m;
	if (n > 9 * m || n < 6 * m) {
		cout << "jgzjgzjgz\n";
	}
	else {
		if (m * 7 > n)cout << 7 * m - n << "\n";
		else cout << 0 << "\n";
	}
	return 0;
}

B:二分

题目描述

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

输入描述:

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

输出描述:

一个数表示答案

输入

10 100 20 100

输出

4

说明

10+30+50+70>=100

备注:

0n,d10^9,n+d>0
1m10^18
1x10^9

描述说明:

数据规模比较大,枚举肯定超时,用二分就可以了,还有就是用long long

#include<iostream>
using namespace std;
long long n, m, d, x;
int cha()
{
	long long l = 1, r = x,aa=1;
	while (l <= r)
	{
		long long mid = (l + r) >> 1;
		if ((mid*(n+n+(mid - 1)*d)/ 2)  < m && ((mid + 1)*(n+n+mid*d) / 2) >= m) {
			aa = mid+1;
			break;
		}
		else if ((mid*(n+n+(mid-1)*d)/2)<m) l = mid+1;
		else r = mid-1;
	}
	return aa;
}
int main()
{
	cin >> n >> m >> d >> x;
	long long ans;
	ans=cha();
	cout << ans << endl;
	return 0;
}

C:贪心,STL_sort_cmp

题目描述

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

输入描述:

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

输出描述:

一个数表示答案

输入

5 3
1 2 3
3 2 1

输出

9

输入

5 3
1 2 1
3 2 1

输出

8

备注:

1n,m10^5,0ai,bi10^6

描述说明:

贪心,定义一个结构体,从喜爱度由大到小排序.

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
struct test {
	ll a;
	ll b;
}x[100010];
bool cmp(const test aa,const test bb)
{
	return aa.b > bb.b;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	long long n, m;
	long long ans = 0;
	cin >> n >> m ;
	for (int i = 0; i < m; i++)
		cin >> x[i].a;
	for (int i = 0; i < m; i++)
		cin >> x[i].b;
	sort(x, x + m, cmp);
	int i=0,j = 0;
	while (j < n&&i<m) {
		while (x[i].a > 0&&j<n&&i<m) {
			ans += x[i].b;
	//		cout << ans << " ";
			x[i].a--;
			j++;
		}
		i++;
	}
	cout << ans<<endl;
}

  

 D:贪心,思维

题目描述

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

输入描述:

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

输出描述:

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

输入

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)
注意不一定要吃完。

备注:

描述说明:

当前余零的话,就下一个;当前余一的话,就判断下一个是否>=1,是就凑一对,否就舍弃。

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll a[100010];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	ll n, ans = 0, zz = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < n; i++) {
		ans += a[i] >> 1;
		if (a[i]&1&&a[i + 1] >= 1){
			ans++;
			a[i + 1]--;
		}
	}
	cout << ans << "\n";
}

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。

输入

99 109
68 77
55 66
34 43
1111234 1114321

输出

111
79
127
47
1179647

备注:

输入不超过10000行,0≤a,b≤10^18,ab

描述说明:

0|1=1;1|0=1;1|1=1;0|0=0;一堆数相或,即判断一堆数中二进制里的每一位是否含1。如果b=a+1,那么结果=a|a+1,如果b>a+1,那最少大2,所以二进制最少进一位。

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	ll a, b;
	while (cin >> a >> b) {
		while (a < b) {
			a = a | a+1;
		}
		cout << a << "\n";
	}
	return 0;
}

  

 

猜你喜欢

转载自www.cnblogs.com/52dxer/p/10352995.html