日志:贪心

排队接水

时间限制: 1 Sec 内存限制: 128 MB
题目描述
有n 个人在一个水龙头前排队接水,假如每个人接水的时间为ti ,请编程找出这n 个人
排队的一种顺序,使得n 个人的平均等待时间最小。
输入
第一行为n(1<=n<=5000)。第二行分别表示第1 个人到第n 个人每人的接水时间t1,
t2…,tn,每个数据之间有一个空格。(0<=ti<=10000)
输出
共两行,第一行为一种排队顺序,即1 到n 的一种排列,且保证小序号靠前(如:“2 3”
与“3 2”,在平均等待时间一样时,输出“2 3”;第二行为这种排列方案下的平均等待时
间(输出结果精确到小数点后两位,在小数点后三进行四舍五入)。
样例输入
10
56 12 1 99 1000 234 33 55 99 812
样例输出
3 2 7 8 1 4 9 6 10 5
291.90
解析:
这题比较简单,要使得后面等待的时间少,那么尽量让接水时间短的人排在前面,于是
我们可以使用二级排序,优先让接水时间短的人排在前面,如果接水时间一样,就按读入的
顺序小的排在前面,这样就能做到最优方案了,至于最终的时间,就模拟一下统计总时间,
然后除以人数。(需要注意的是,第一个人不用等待,但第一个人接水的时间就是第二个人
等待时间,最后一个人的接水时间没意义,因为没人等待了)

#include// 不难
#include
using namespace std;
struct ren{
int time,id;
}(p[5100]);
bool cmp(ren x,ren y){
if(x.time!=y.time)return x.time<y.time;
return x.id<y.id;
}
int main(){
int i,tot=0,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&p[i].time);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++){
tot += (n-i)p[i].time;
printf("%d “,p[i].id);
}
printf(”%.2f",1.0
tot/n);
return 0;
}

最大整数

时间限制: 1 Sec 内存限制: 128 MB
题目描述
设有n 个正整数(n<=20),将它们连接成一排,组成一个最大的多位数。
例如:n=3 时,3 个整数13,312,343 连接成的最大整数为:34331213
又如:n=4 时,4 个整数7,13,4,246 连接成的最大整数为:7424613
输入
第1 行,n;
第2 行,n 个数。
输出
连接成的多位数。
样例输入
3 13 312 343
样例输出
34331213
解析:
此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,
测试题目的例子也都符合,但最后测试的结果却不全对。按这种标准,我们很容易找到反例:
12,121 应该组成12121 而非12112,那么是不是相互包含的时候就从小到大呢?也不一
定,如12,123 就是12312 而非12123,这种情况就有很多种了。是不是此题不能用贪
心法呢?
其实此题可以用贪心法来求解,只是刚才的标准不对。我们发现更最基本的排序一样,
哪个数字在前,哪个数字在后,比较的是两种方案的大小比较。假设已经有最优方案产生前
面的数字t,当前要比较先接a,还是先接b,我们可以比较t+a+b 和t+b+a(这里的“+”
是连接符号),如果t+a+b>=t+b+a,那么先接a,反之先接b。但其实只要比较a+b 和
b+a 就行了,因为t 是公共部分,于是基本的贪心策略就出来了:
先把整数转换成字符串,然后比较a+b 和b+a,如果a+b>=b+a,就把a 排在b 的前
面,反之则把a 排在b 的后面。

#include//也不太难
#include
#include
using namespace std;
char s[1002],s1[1002],change[1002];
void charu(){
int a=atof(s);
int b=atof(s1);
int l=strlen(s);
int l1=strlen(s1);
if(apow(10,l1)+b>=bpow(10,l)+a) strcat(s,s1);
else{
strcpy(change,s);
strcpy(s,s1);
strcat(s,change);
}
}
int main(){
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s",s1);
if(i==1){
strcpy(s,s1);
continue;
}
charu();
}
printf("%s",s);
}

纪念品分组【NOIP2007】

时间限制: 1 Sec 内存限制: 128 MB
题目描述
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获
得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两
件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时
间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入
含n+2 行:
第1 行包括一个整数w,为每组纪念品价格之和的上限;
第2 行为一个整数n,表示购来的纪念品的总件数;
第3-n+2 行每行包含一个正整数Pi(5<=Pi<=w),表示所对应纪念品的价格。
输出
仅一行,包含一个整数,即最少的分组数目。
样例输入
100
9 90
20
20
30
50
60
70
80
90
样例输出
6
提示
50%的数据满足: 1<=n<=15
100%的数据满足: 1<=n<=30000,80<=W<=200
解析:
题目要求每个组最多分两个纪念品,如果是小的数字,那么它可能可以跟很多其他数字
组合,比如样例:90 20 20 30 50 60 70 80 90,比如20 可以有很多的组合选择;
但大的数字可以组合的机会比较少,比如90 没的选择,80 只能跟20 组合才不会超过100,
因此我们发现可以从较大数字优先着手:
首先排序,当前剩余数字中最大的数字如果能跟最小的数字组合,就让它们分为一组,
否则最大数字单独一组,并弹掉最大的数字,重复上述操作,直到数字取光,那么构成的组
数即为答案。

#include //也也不太难
#include
#include
#include
using namespace std;
int main(){
int i,n,w,tot,a[30002],place=1;
scanf("%d%d",&w,&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
tot=n;
for(i=n;i>place;i–){
if(a[i]+a[place]<=w){
tot–;
place++;
}
}
printf("%d",tot);
}

零件分组

时间限制: 1 Sec 内存限制: 128 MB
题目描述
某工厂生产一批棍装零件,每个零件都有一定的长度(li)和重量(wi).现在为了加工需
要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若i<j,则
li<=lj,wi<=wj)的序列。请问至少要分成几组。
输入
第一行为一个整数n(n<=1000),表示零件的个数。第二行有n 对正整数,每对正整数表示
这些零件的长度和重量,长度和重量均不超过10000。
输出
仅一行,即最少分成的组数。
样例输入
58
4
3 8
2 3
9 7
3 5
样例输出
2
提示
二级排序
解析:
首先我们二级排序,那么问题就只需要比较没有排序的另一边数据,比如1 3 2 6 4
7 5,刚开始1 就分成组1,元素为{1},当3 来的时候,可以放到组1,就不额外增加组
了{1, 3}, 2 来的时候有分歧了,可以是{1,2} {3},也可以是{1,3} {2},那么我
们发现两种情况其实效果一样,因为每个分组在乎的是最后一个数字,那么我们任意选择
{1,3}{2}的方案,因为这样就不用调整3 了。再来6 的时候,我们发现,6 接到3 后面
比较好,使得两组末尾的数字变为{6}{2},比{6}{3}要好。4 来的时候,接到2 后面,7
来的时候接6 后面,5 来的时候接4 后面,于是方案就为{1,3,6,7}{2,4,5}
这个时候贪心策略就自然出来了,也就是每个数字开始,往后取数字,取比它大的接在
后面,比它小的先忽略,一直取到数列最后,构成一个分组。接下来重新开始选择数字,构
成第二个分组,直到数列中的元素取完。那么最终有多少组就是答案。

#include//这道题的本质就是记录最小值更新的次数,我觉得我编的比题解要更好一些
#include
#include
#include
using namespace std;
int main(){
int n,l[1002],w[1002],i,min,judge=1,tot=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&l[i],&w[i]);
}
sort(l+1,l+1+n);
for(i=2;i<=n;i++){
if(judge){
if(w[i]<w[i-1]){
tot++;
judge=0;
min=w[i];
}//一开始min相当于w[i-1]
}
else{
if(w[i]<min) tot++;
}
}
printf("%d",tot);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021“MINIEYE杯”中国大学生算法设计超级联赛(1)zoto(二维数颜色)

zoto Code1 树状数组套动态开点权值线段树 效仿HH的项链&#xff0c;维护右端点&#xff0c;询问需要排序 #include<bits/stdc.h> using namespace std; template <class Tint> T rd() {T res0;char chgetchar();while(!isdigit(ch)) chgetchar();while( isdigi…

通过Microsoft Learn进行学习以提升技能

通过 Microsoft Learn&#xff0c;可以免费而且轻松有趣地学习 Microsoft 技术。Microsoft Learn的与众不同借助 Microsoft Learn&#xff0c;任何人都能按自己的学习计划和速度掌握重要的知识和概念。 使用者将能够访问培训资料、代码示例&#xff0c;以及免费试用产品。无论是…

牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出n,kn,kn,k求 ∑i11n∑i21n...∑ik1ngcd(fi1,fi2,...,fik)\sum_{i_11}^n\sum_{i_21}^n...\sum_{i_k1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})i1​1∑n​i2​1∑n​...ik​1∑n​gcd(fi1​​,fi2​​,.…

牛客题霸 [旋转字符串]C++题解/答案

牛客题霸 [旋转字符串]C题解/答案 题目描述 字符串旋转: 给定两字符串A和B&#xff0c;如果能将A从中间某个位置分割为左右两部分字符串&#xff08;都不为空串&#xff09;&#xff0c;并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。 例如…

震惊!递推与递归竟然可以这么编!%99的程序员都不知道!

四、归并排序&#xff08;逆序对&#xff09; (一)、归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b; 即先使…

asp.net core webApi 参数保护

Introasp.net core data protection 扩展&#xff0c;基于 IDataProtector 扩展的数据保护组件&#xff0c;自动化的实现某些参数的保护ParamsProtectionParamsProtection 是为了保护 asp.net core webapi 项目的某些参数而设计的&#xff0c;也可以用来做一定程度上的反爬虫。…

2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

J-Product of GCDs Code1 对于每个质数以及每个质数的次幂单独考虑他们的贡献&#xff0c;由于多次使用快速幂导致TLE #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!is…

AT2390-[AGC016F]Games on DAG【状压dp,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/AT2390 解题思路 nnn个点的DAGDAGDAG&#xff0c;mmm条边可有可无&#xff0c;111和222上有石头。求有多少种方案使得先手必胜。 1≤n≤15,1≤m≤n(n−1)21\leq n\leq 15,1\leq m\leq \frac{n(n-1)}{2}1≤n≤15,1≤m≤2n(n−1…

牛客题霸 [合并两个有序的数组] C++题解/答案

牛客题霸 [合并两个有序的数组] C题解/答案 题目描述 给出两个有序的整数数组 和 &#xff0c;请将数组 合并到数组 中&#xff0c;变成一个有序的数组 注意&#xff1a; 可以假设 数组有足够的空间存放 数组的元素&#xff0c; 和 中初始的元素数目分别为 和 题目描述 给出…

震惊!快速幂怎么编?省一说暴力,银牌说递归,国集听完笑了

国集&#xff1a;打表啊&#xff01;&#xff01; 题目描述 给你三个整数 b,p,kb,p,kb,p,k&#xff0c;求 bp mod kb^p \bmod kbpmodk。 输入格式 输入只有一行三个整数&#xff0c;分别代表 b,p,kb,p,kb,p,k 输出格式 输出一行一个字符串 b^p mod ks&#xff0c;其中 b,…

CF1392G-Omkar and Pies【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1392G 题目大意 两个长度为kkk的起始和目标01串。 nnn个操作交换起始串的两个位置&#xff0c;选择一段长度至少为mmm的连续操作序列使得相同的位数最多。 1≤m≤n≤106,1≤k≤201\leq m\leq n\leq 10^6,1\leq k\leq 201≤…

codeforces1484 B. Restore Modulo(数学)

B. Restore Modulo 忘了当时怎么乱搞的了~ #include<bits/stdc.h>using namespace std; using lllong long;constexpr int N200010;int n; ll a[N],d[N],d0[N]; int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T1;cin>>T;whil…

牛客题霸 [反转字符串] C++题解/答案

牛客题霸 [反转字符串] C题解/答案 题目描述 写出一个程序&#xff0c;接受一个字符串&#xff0c;然后输出该字符串反转后的字符串。&#xff08;字符串长度不超过1000&#xff09; 题解&#xff1a; 有reverse现成的翻转函数&#xff0c;直接套进去就可以 如果不用函数的…

新汉诺塔(洛谷P1242)含第11个数据的解决办法

解析 应该从大到小一个个移&#xff0c;这样后面大盘就可以直接忽略&#xff0c;保证没有冗余操作&#xff0c;必定最优&#xff08;如果先移动小的&#xff0c;后面移动大的时还要动小的&#xff09; 对于第id个从当前位置到目标的移动有两种移动方案&#xff1a; 法1&#x…

让 .Net 更方便的导入导出Excel

Intro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xls 的差别&#xff0c;屏蔽了 Np…

P7115-[NOIP2020]移球游戏【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 n1n1n1个柱子&#xff0c;前面nnn个上面各有mmm个球&#xff0c;球有nnn种颜色&#xff0c;每种mmm个。 你每次可以把一个柱子最上面的球放到另一个上面&#xff0c;要求在820000820000820000次内使得同种颜色…

2021牛客暑期多校训练营1 I-Increasing Subsequence(期望dp+优化)

I-Increasing Subsequence fi,j,0/1f_{i,j,0/1}fi,j,0/1​表示上一轮第一个人选了iii&#xff0c;第二个人选了jjj&#xff0c;并且当前是第1/2个人选择的概率。 转移考虑枚举k下一步往哪走 fi,k,1∑fi,j,0/cntf_{i,k,1}\sum f_{i,j,0}/ \text{cnt}fi,k,1​∑fi,j,0​/cnt fk,…

牛客题霸 [子数组的最大累加和问题] C++题解/答案

牛客题霸 [子数组的最大累加和问题] C题解/答案 题目描述 给定一个数组arr&#xff0c;返回子数组的最大累加和 例如&#xff0c;arr [1, -2, 3, 5, -2, 6, -1]&#xff0c;所有子数组中&#xff0c;[3, 5, -2, 6]可以累加出最大的和12&#xff0c;所以返回12. [要求] 时间复…

无限序列 (ybtoj C.3)

解析 乍一看很蒙的题 首先&#xff0c;a-b1的个数可以等价于**&#xff08;1-b&#xff09;1的个数减去&#xff08;1-a-1&#xff09;1的个数** 分析之后发现&#xff0c;经过多次变换后&#xff1a; 长度 1的个数 1 1 2 1 3 2 5 3 8 5 … … 又是熟悉的斐波拉契。。。 但是我…

P5644-[PKUWC2018]猎人杀【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P5644 题目大意 nnn个人&#xff0c;每个人被选中的权重是aia_iai​。每次按照权重选择一个没有死掉的人杀死&#xff0c;求第111个人最后死的概率。输出答案对998244353998244353998244353取模。 wi>0,∑i1nwi≤105w_i>…