题目链接:
题号 | 标题 | 已通过代码 |
---|---|---|
A | 出题 | 点击查看 |
B | 煤气灶 | 点击查看 |
C | 项链 | 点击查看 |
D | 美食 | 点击查看 |
E | 海啸 | 点击查看 |
F | 石头剪刀布 | 点击查看 |
G | 区间或和 | 点击查看 |
H | 肥猪 | 点击查看 |
I | wzoi | 点击查看 |
J | 迷宫 | 点击查看 |
A:思维
题目描述
小B准备出模拟赛。
她把题目按难度分为四等,分值分别为6,7,8,9。
已知小B共出了m道题,共n分。
求小B最少出了多少道6分题。
她把题目按难度分为四等,分值分别为6,7,8,9。
已知小B共出了m道题,共n分。
求小B最少出了多少道6分题。
输入描述:
两个正整数n,m
输出描述:
一个数,表示答案。
若无解,输出"jgzjgzjgz"。
输入
34 5
输出
1
输入
32 5
输出
3
输入
5 1
输出
jgzjgzjgz
备注:
n,m≤1012
描述说明:
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最少工作几天才能买到煤气灶。
第一天,小j的工资为n元,之后每天他的工资都比前一天多d元。
已知煤气灶需要m元,求小j最少工作几天才能买到煤气灶。
输入描述:
四个整数 n,m,d,x
分别表示小j第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过x
输出描述:
一个数表示答案
输入
10 100 20 100
输出
4
说明
10+30+50+70>=100
备注:
0≤n,d≤10^9,n+d>0
1≤m≤10^18
1≤x≤10^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)
现在有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
备注:
1≤n,m≤10^5,0≤ai,bi≤10^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想知道,她最多能吃几次?
现在有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,a≤b
描述说明:
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; }