试题分析:这道题目考察的是排序与模拟,题目要求明确,我们只需要模拟出来即可,我们需要对分数进行排序,而sort的时间复杂度为o(logn),所以会超时,所以我们选择归并,归并的时间复杂度为o(n),这里我用了<algorithm>中自带的merge函数。 代码如下:
[2016年NOIP普及组] 买铅笔 思路:P老师决定只买同一种包装的铅笔同时也要最划算,那么可以循环进行3次计算。每次的价格都与最小值比较,如果小于最小值,就代替当前最小值。 分析:计算时,要算出买几包铅笔。商店不允许将铅笔的包装拆开——也就是当铅笔数量不能被每包铅笔的数量整除时,因此
[2009年NOIP普及组] 分数线划定 分析:根据题意,定义结构体将序号与成绩联系起来,这时sort函数排序不符合题意,需根据题意手打排序,根据题目给出的条件求人数和分数线,还需注意的一点是,如果有人的成绩等于分数线,那么也把他算进人数中,需要加个for循环过一遍入围人选,再用if语句判断即可。
[2015年NOIP普及组] 金币 思路:第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的
首先归并排序,先比较,放入胜者组和败者组,去掉之前的分离,直接继续归并 #include<bits/stdc++.h>using namespace std; int n,q,bsl[2000001],bxh[2000001],bfs[2000001],ll,rr,rrr;int i,j,ij,ii;struct a{ int xh; int fs; int sl;}a[200002],w[100002],f[100002];void ef(int l,int
用桶排排序,用贪心找出最优解 #include<bits/stdc++.h>using namespace std; int m,n,k,d,l,a,b,c,e,maxs,bj;int i,j,ii,mm[33000],ll[23000],ms[33000],ls[33000];int main(){ cin>>m>>n>>k>>l>>d; for(j=1;j<=d;j++){ cin>>a>>b>
【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的
请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。比如在给定范围[2, 22],数字2在数2中出现了1次,在数12中出现了1次,在数20中出现了1次,在数21中出现了1次,在数22中出现了2次,所以数字2在该范围内一共出现了6次。 输入 输入共一行,为两个正整数L和R,之间用一个空格隔开。 输出
[2010年NOIP普及组] 数字统计题目大意是在[l,r]这个区间中,统计所有数字的每一位上有多少2。很明显,这个题目要用到数字拆分。代码如下:int a=i;while(a!=0){int b;b=a%10;//单独提出最后一位if(b==2)n++;//统计a=(a-b)/10;//删除最后一位,让倒数第二位成为最后一位,重复上述过程}总代
给能够到的高度加30,依次比较 #include<bits/stdc++.h>using namespace std;int main(){ int a[17],i,j,s=0; for(i=1;i<=10;i++){ cin>>a[i]; } cin>>j; j=j+30; for(i=1;i<=10;i++){ if(a[i]<=j){ s++; } } cout<<s;}
将每月得到的与原有的和花费比较,注意最后一月剩下的加起来 #include<bits/stdc++.h>using namespace std;int main(){ int a[15],i,j=0; double ss,s=0; for(i=1;i<=12;i++){ cin>>a[i]; } for(i=1;i<=12;i++){ j=j+300; if(j<a[i]){ cout<<"-"<<i; r
注意如果一名选手为11(21)分,而另一名选手与其分的差距小于2,则比赛继续进行,直到差距等于2为止 #include<bits/stdc++.h>using namespace std;int i=0,j,w=0,l=0;char a[90000];int main(){ while(1){ i++; cin>>a[i]; if(a[i]=='E'){ i--; break; } } for(j=1;j<=i;j++){ if
用分离法得出每位上的2 #include<bits/stdc++.h>using namespace std;int main(){ int l,i,r,s=0,j; cin>>l>>r; for(i=l;i<=r;i++){ j=i; while(j>0){ if(j%10==2){ s++; } j=j/10; } } cout<<s;}
模拟出每天骑士获得的金币,加起来 #include<bits/stdc++.h>using namespace std;int main(){ int n,i,j=0,s=0,bj=1; cin>>n; for(i=1;i<=n;i++){ j++; s=s+bj; if(j==bj){ bj++; j=0; } } cout<<s;}
3.[2007年NOIP普及组] 奖学金 l 分析:根据题意,定义结构体,学号与成绩联系起来,在sort函数的基础上根据题意写一个排序函数(主要是if的应用),最后输出前五名。 l #include<cstdio> #include<iostream> #include<algorithm> using namespace std; struct node//定义结构体 {
1. [2006年NOIP普及组] 明明的随机数 l 分析:根据题意,设置一个标记数组和一个计数器,用for语句将数过一遍,将第一次出现的数标记为一,计数器加一,输出计数器就是不同随机数的个数,再用for语句将指定范围内的数过一遍,将其中已标记的数输出。 l #include<cstdio> #include<iostream
试题解析:本题要考虑两点,1.按照笔试成绩从高到低输出,2.如果成绩相同,则按报名号由小到大的顺序输出。所以我们运用了sort函数进行排序,用了结构体同时比较成绩以及报名号。如果最后到达分数线的大于预订人数,我们就要扩展人数。 代码如下:
试题分析:本题重在计算每种笔最少买多少盒,然后进行比较,寻找最小即可。 注意:minn变量开大,不然会wa。
试题分析:题目说明了十一分制与二十一分制要求,所以我们模拟即可,注意要大于对手两分才算赢,否则比赛继续进行。 注:由于格式问题,博主只好用数组存储数据进行二次判断。
题目描述:题目要求统计l-r之间“2”出现的次数,其实也就是要求将l-r之间每个数字进行分离,寻找2,若出现,则累加。 代码如下:
[2004年NOIP提高组] 津津的储蓄计划 思路:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里(存妈妈那里会有20%的利润),剩余的钱留在自己手中。 分析:当津津手中的钱加上这个月妈妈给的钱,不足以支撑这个月的原
[2003年NOIP普及组] 乒乓球 思路:将两人比赛成绩分别同时计分,满足比赛规则就记录,依次输出。 分析:在比赛中,当双方比分都大于等于10的情况下要连续赢两球,才算赢。 注意:比完了第一场,下一场还没开始,那也要输出0:0 #include<cstdio> #include<iostream> using namespace std; int main()
[2010年NOIP普及组] 数字统计 思路:既然要统计某个给定范围[L, R]的所有整数中,数字2出现的次数,就可以将这个范围中的数的所有位数取出来。当有2时,计数器+1。 注意:取余后不要忘记原数/10。 代码如下: #include<iostream> #include<algorithm> #include<cstring> using namespace std;