前言
参考视频教程 NOIP 洛谷试练场 普及组 贪心
有就要
以简单基础普及题型为例,可在洛谷上查找题目提交,代码仅供参考。
题目列表:
1.P1181 数列分段 Section I
2.P1094 [NOIP2007 普及组] 纪念品分组
3.P1208 [USACO1.3]混合牛奶 Mixing Milk
1.P1181 数列分段 Section I
题目描述
对于给定的一个长度为NN的正整数数列A_iA**i,现要将其分成连续的若干段,并且每段和不超过MM(可以等于MM),问最少能将其分成多少段使得满足要求。
输入格式
第1行包含两个正整数N,MN,M,表示了数列A_iA**i的长度与每段和的最大值,第22行包含NN个空格隔开的非负整数A_iA**i,如题目所述。
输出格式
一个正整数,输出最少划分的段数。
输入输出样例
输入 #1复制
5 6
4 2 4 5 1
输出 #1复制
3
说明/提示
对于20%20%的数据,有N≤10N≤10;
对于40%40%的数据,有N≤1000N≤1000;
对于100%100%的数据,有N≤100000,M≤109*N*≤100000,*M*≤109,M*M*大于所有数的最小值,A_i*A**i*之和不超过109109。
将数列如下划分:
[4][2 4][5 1][4][24][51]
第一段和为44,第22段和为66,第33段和为66均满足和不超过M=6M=6,并可以证明33是最少划分的段数。
代码
#include<iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int sum = 0;
int cnt = 1;
while (n--)
{
int temp;
cin >> temp;
if (sum + temp <= m)
{
sum += temp;
}
else
{
cnt++;
sum = temp;
}
}
cout << cnt;
return 0;
}
2.P1094 [NOIP2007 普及组] 纪念品分组
题目描述
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式
共 n+2n+2 行:
第一行包括一个整数 ww,为每组纪念品价格之和的上上限。
第二行为一个整数 nn,表示购来的纪念品的总件数 GG。
第 3\sim n+23∼n+2 行每行包含一个正整数 P_iP**i 表示所对应纪念品的价格。
输出格式
一个整数,即最少的分组数目。
输入输出样例
输入 #1复制
100
9
90
20
20
30
50
60
70
80
90
输出 #1复制
6
说明/提示
50%50% 的数据满足:1\le n\le151≤n≤15。
100%100% 的数据满足:1\le n\le3\times10^41≤n≤3×104,80\le w\le20080≤w≤200,5 \le P_i \le w5≤P**i≤w。
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[300010];
int main()
{
int w, n;
cin >> w >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int l = 1;
sort(a + 1, a + n + 1);
int cnt = 0;
while (l <= n)
{
if (a[l] + a[n] <= w)
{
l++;
n--;
cnt++;
}
else
{
n--;
cnt++;
}
}
cout << cnt;
return 0;
}
3.P1208 [USACO1.3]混合牛奶 Mixing Milk
题目描述
由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。
Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天 Marry 乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。
给出 Marry 乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。
注:每天所有奶农的总产量大于 Marry 乳业的需求量。
输入格式
第一行二个整数 n,mn,m,表示需要牛奶的总量,和提供牛奶的农民个数。
接下来 mm 行,每行两个整数 p_i,a_ip**i,a**i,表示第 ii 个农民牛奶的单价,和农民 ii 一天最多能卖出的牛奶量。
输出格式
单独的一行包含单独的一个整数,表示 Marry 的牛奶制造公司拿到所需的牛奶所要的最小费用。
输入输出样例
输入 #1复制
100 5
5 20
9 40
3 10
8 80
6 30
输出 #1复制
630
说明/提示
【数据范围】
对于 100%100% 的数据:
0 \le n,a_i \le 2 \times 10^60≤n,a**i≤2×106,0\le m \le 50000≤m≤5000,0 \le p_i \le 10000≤p**i≤1000
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct row
{
int m;
int l;
};
bool cmp(row a, row b)
{
return a.m < b.m;
}
int main()
{
int n, m;
cin >> n >> m;
row a[5020];
for (int i = 1; i <= m; i++)
cin >> a[i].m >> a[i].l;
sort(a + 1, a + m + 1, cmp);
int sum = 0;
for (int i = 1; i <= m; i++)
{
if (n >= a[i].l)
{
n -= a[i].l;
sum += a[i].l * a[i].m;
}
else
{
sum += n * a[i].m;
break;
}
}
cout << sum;
return 0;
}