【刷题第九天】贪心二——C++
【题目描述】
学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini<endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多
【输入】
第一行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个begini,第二个是endi(begini<endi≤32767)。
【输出】
输出最多能安排的活动个数。
【输入样例】
11 3 5 1 4 12 14 8 12 0 6 8 11 6 10 5 7 3 8 5 9 2 13
【输出样例】
4
【算法分析】
起初我是想到利用开始和结束的差进行排序,然后按照顺序比较(和另一个满足条件的数组比较),满足条件的加入另一个数组,没满足条件的跳过(条件:开始时间或结束时间不能在满足条件的时间内,或开始时间和结束时间都不能在满足条件的时间之外),这种方法测试之后大部分是可以的,但是有两个测试点不能满足,也检查不出哪里有错误,应该是算法的问题。
之后的方法就是将结束的时间进行排序,然后按照顺序比较,后面的开始时间要大于等于前面的结束时间(满足这个条件即可)。很简单,但是我就是没想出来,🤦。
1 #include <iostream> 2 using namespace std; 3 typedef struct My { 4 int begin; 5 int end; 6 }Time; 7 int main() { 8 int n, m = 0, k; 9 Time time[1000], t; 10 cin >> n; 11 for (int i = 0; i < n; i++) 12 { 13 cin >> time[i].begin >> time[i].end; 14 } 15 for (int i = 0; i < n-1; i++) 16 { 17 for (int j = 0; j < n-i-1; j++) 18 { 19 if (time[j].end > time[j+1].end) { 20 t = time[j]; 21 time[j] = time[j + 1]; 22 time[j + 1] = t; 23 } 24 } 25 } 26 k = 0; 27 int i; 28 while (k < n) { 29 for (i = k+1; i < n; i++) 30 { 31 if (time[k].end <= time[i].begin) { 32 m++; 33 k = i; 34 break; 35 } 36 } 37 if (k == 0) { 38 m = 0; 39 } 40 if (i >= n) { 41 break; 42 } 43 } 44 cout << m + 1; 45 return 0; 46 }
【题目描述】
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为。这些产品通常使用一个
的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
【输入】
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为这些产品通常使用一个的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
【输出】
输入包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为至6这六种产品的数量。输入将以6个0组成的一行结尾。
【输入样例】
0 0 4 0 0 1 7 5 1 0 0 0 0 0 0 0 0 0
【输出样例】
2 1
【算法分析】
一句话不会,想半天都想不出来,醉了。
解题思路:https://blog.csdn.net/youyang1991/article/details/6716044
比我更简单的代码:https://blog.csdn.net/C_Dreamy/article/details/104309069
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int main() { 6 int a[6]; 7 cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5]; 8 while (!(a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0 && a[5] == 0)) { 9 int zhi = 0, n1 = 0, n2 = 0; 10 zhi = a[5] + a[4] + a[3] + a[2] / 4; 11 if (a[2] % 4 != 0) { 12 zhi += 1; 13 } 14 n1 = a[4] * 11; 15 n2 = a[3] * 5; 16 if (a[2] % 4 == 1) { 17 n2 += 5; n1 += 7; 18 } 19 else if (a[2] % 4 == 2) { 20 n2 += 3; n1 += 6; 21 } 22 else if (a[2] % 4 == 3) { 23 n2 += 1; n1 += 5; 24 } 25 if (a[1] - n2 > 0) { 26 zhi += (a[1] - n2) / 9; 27 if ((a[1] - n2) % 9 != 0) { 28 zhi += 1; 29 a[1] = (a[1] - n2) % 9; 30 n1 += 36 - a[1] * 4; 31 } 32 } 33 else { 34 n1 += (n2 - a[1]) * 4; //这个一定要注意不能忘了,就是没想到这个,我找了一下午的错误,(╬◣д◢)。上面2*2所占的小箱子如果多了就要将n2的空间变成1*1的小箱子。 35 } 36 if (a[0] - n1 > 0) { 37 zhi += (a[0] - n1) / 36; 38 if ((a[0] - n1) % 36 != 0) { 39 zhi += 1; 40 } 41 } 42 cout << zhi << endl; 43 cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5]; 44 } 45 return 0; 46 } 47 48
1227:Ride to Office
【题目描述】
起点与终点相隔4500米。现Charley需要从起点骑车到终点。但是,他有个习惯,沿途需要有人陪伴,即以相同的速度,与另外一个人一起骑。而当他遇到以更快的速度骑车的人时,他会以相应的速度跟上这个更快的人。先给定所有与Charley同路的人各自的速度与出发时间,问Charley以这种方式跟人,骑完4500米需要多少时间。得出的结果若是小数,则向上取整。
【输入】
输入若干组数据,每组数据第一行n(1≤n≤10000),n为0,表示输入结束,接着输入n行数据,每行2个数据,表示速度v和出发时间t,如果t<0,表示陪伴人提早出发了。
【输出】
输出对应若干行数据,每行输出1个数,表示最快到达的时间。
【输入样例】
4 20 0 25 -155 27 190 30 240 2 21 0 22 34 0
【输出样例】
780 771
【题目分析】
首先要知道Charley是不会跟着t<0出发的陪伴者,这是因为等Charley出发的时候之后如果速度小于这个陪伴者,那么是跟不上的,如果大于那么中途会超上去,所以就没有必要去算提早走的。另外题目中说了一大堆,其实本质求速度最快的陪伴者的到达时间。另外这里的速度是千米/小时,而出发时间是秒(因为单位不知道我想了很久,想吐)。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 7 typedef struct My { 8 int v; 9 int t; 10 double s; 11 }Charley; 12 bool cmp(Charley a, Charley b); 13 14 int main() { 15 Charley charley[10000]; 16 int n; 17 cin >> n; 18 while (n!=0) 19 { 20 for (int i = 0; i < n; i++) 21 { 22 cin >> charley[i].v >> charley[i].t; 23 if (charley[i].t >= 0) { 24 charley[i].s = charley[i].t + 4500 / (charley[i].v*1000.0 / 3600); 25 } 26 else { 27 charley[i].s = -1; 28 } 29 30 } 31 sort(charley, charley + n ,cmp); 32 for (int i = 0; i < n; i++) 33 { 34 if (charley[i].s != -1) { 35 cout << ceil(charley[i].s) << endl; 36 break; 37 } 38 } 39 cin >> n; 40 } 41 return 0; 42 } 43 44 bool cmp(Charley a, Charley b) { 45 return a.s < b.s; 46 }
1232:Crossing River
【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1 4 1 2 5 10
【输出样例】
17
【思路分析】
https://blog.csdn.net/han_hhh/article/details/89602745
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 int main() { 7 int t, n, time[100000]; //题目没有写最大多少个人,就默认多一点 8 cin >> t; 9 while (t--) 10 { 11 cin >> n; 12 int sum = 0; 13 for (int i = 0; i < n; i++) 14 { 15 cin >> time[i]; 16 } 17 sort(time, time + n); //要排序过 18 while (true) { 19 if (n == 1) { 20 sum += time[0]; 21 break; 22 } 23 else if (n == 2) { 24 sum += time[1]; 25 break; 26 } 27 else if (n == 3) { 28 sum += time[2] + time[0] + time[1]; 29 break; 30 } 31 else { 32 sum += min(time[n - 1] + time[0] * 2 + time[n - 2], time[1] * 2 + time[0] + time[n - 1]); //这是两种方案取最小的一个方案,想哭,自己想到的只有一个 33 n = n - 2; 34 } 35 } 36 cout << sum << endl; 37 } 38 return 0; 39 }

浙公网安备 33010602011771号