表示塔萌大学生智商好高,居然能搞出这么耗脑筋的题(详见C题)……先膜再发题解……

A 发工资咯:)

有面值为壹佰元、伍拾元、拾元、伍元、贰元、壹元的人民币,问付给他人xx元(xx为正整数)最少需多少纸币。

思想:贪心
知识:生活常识

#include <cstdio>
#include <algorithm>
#include <vector>#define NMAX 100
#define M 6int v[M]={100,50,10,5,2,1};using namespace std;int main(){int n;int tmp,num;int i,j;while(true){scanf("%d",&n);if(!n)return 0;num=0;for(i=0;i<n;i++){scanf("%d",&tmp);for(j=0;j<M;j++){num+=tmp/v[j];tmp%=v[j];}}printf("%d\n",num);}return 0;
}

B Saving HDU

现有nn种物品,其中有第ii种物品mim_i个单位体积,该种物品单价(单位体积价值)为pip_i,问一个容积为viv_i的包最多能装多大价值的物品。(一种物品可以只取一部分)

思想:贪心
做法:从价值最高的物品开始,能取完则取完,直至包容积耗尽。(证明详见紫书)
注意:单价!单价!单价!

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>using namespace std;#define NMAX 100struct th{int p,m;bool operator < (const th b)const{return p>b.p;}
};th ths[NMAX];int main(){int v,n,nv;int ans;int i;while(true){scanf("%d",&v);if(!v)return 0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d%d",&ths[i].p,&ths[i].m);//ths[i].v=ths[i].p/(tmp=ths[i].m);}sort(ths,ths+n);ans=0;for(i=0;i<n;i++){nv=min(ths[i].m,v);ans+=nv*ths[i].p;v-=nv;}printf("%d\n",ans);}return 0;
}

C Crossing River

现有nn个人在一条河的一岸,想过河到达对岸,河边只有一条船,船每次只能载两人,每个人过河所需时间不同,两人一起过河所耗时间为过河较慢的人所需花费的时间,问使所有人过河的最短时间。

思想:贪心
思路:
当n≤3n\le3时问题很简单,但当n≥4n\ge4时问题变得就复杂起来……
由于最快的人需要多次陪别人过河,并且把船划回来,所以最快的人耗费的时间总和难以直接计算,所以我们应当从最慢的人开始考虑。
显而易见,要让最慢和次慢的人都过河有两种安排方式:
1. 分别让最快的人陪两人过河,并且每次都由最快的人把船划回来
2. (这就是我一直没想到的关键)让最快与次快的人过河,次快的人把船划回来(此时最快的人留在对岸),最慢和次慢的人把船划到对岸,此时由最快的人把船划回。最终效果是节省了一次最快划船的时间加上次慢划船的时间,减去两次次快划船的时间
做法:每次选择两种方式中节省时间的一种,最快和次快因为把船划回来所以仍停留在岸边,而最慢和次慢以最优方案渡河,问题规模减小2,重复上述过程直至问题规模降至3以内。
感想:简直神思路(贵poj,真!就不得了……),容我再想想如何证明……

#include <cstdio>
#include <algorithm>using namespace std;#define NMAX 1000int a[NMAX];int main(){int t,n;int ans;int ybz;int i;scanf("%d",&t);for(ybz=0;ybz<t;ybz++){scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",a+i);sort(a,a+n);for(ans=0;n>3;n-=2)ans+=min(a[n-1]+a[n-2]+a[0]*2,a[n-1]+a[0]+a[1]*2);if(n==1)ans+=a[0];else if(n==2)ans+=a[1];else ans+=a[0]+a[1]+a[2];printf("%d\n",ans);}return 0;
}

D 今年暑假不AC

数轴上有nn条线段,第ii条线段左右端点分别为ai,bia_i,b_i,现要从中选出若干条线段,使他们相互不覆盖,问最多能选出多少线段。

思路:贪心
做法:先将所有线段排序,先按右端点升序排列,再按左端点降序排列,然后从左到右依次判断线段是否与已有线段覆盖,若不覆盖则选择此线段。

#include <cstdio>
#include <algorithm>
#include <vector>using namespace std;#define NMAX 100struct seg{int s,t;bool operator < (const seg b)const{return (t==b.t)?(s>b.s):(t<b.t);}
};seg ss[NMAX];int main(){int n;int last,num;int i;while(true){scanf("%d",&n);if(!n)return 0;for(i=0;i<n;i++)scanf("%d%d",&ss[i].s,&ss[i].t);sort(ss,ss+n);last=num=0;for(i=0;i<n;i++)if(last<=ss[i].s){num++;last=ss[i].t;}printf("%d\n",num);}return 0;
}

E Hero

在一场dota游戏中,你坚定不移地想装个b单挑对面所有英雄,每个英雄有自己的dps和hp,你的英雄dps只有1,而hp无限。你每次可以挑战一个英雄,使他的hp降低1(若hp降低为零,则英雄死亡),而同时你要承受所有未死亡英雄的攻击,即hp要降低对方所有未死亡英雄dps之和,问要杀死对方所有英雄,hp最少降低多少。

思想:贪心
做法:类似背包问题贪心算法。

 #include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>using namespace std;#define NMAX 20struct hero{int dps,hp;double v;bool operator < (const hero b)const{return v>b.v;}
};hero ls[NMAX];int main(){int n;int ans,t;int i;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++){scanf("%d%d",&ls[i].dps,&ls[i].hp);ls[i].v=ls[i].dps/(double)ls[i].hp;}sort(ls,ls+n);ans=t=0;for(i=0;i<n;i++){ans+=(ls[i].hp+t)*ls[i].dps;t+=ls[i].hp;}printf("%d\n",ans);}return 0;
}

F 子序列

输入一段序列和整数S0S_0,求原序列的一段最短的连续子序列,使子序列所有项的和SS满足S>S0S>S_0。

思路一:前缀和+二分查找(这两天学的全用上……),时间复杂度O(nlogn)O(n\log n)

#include <cstdio>
#include <algorithm>
#include <vector>using namespace std;#define NMAX 100000int a[NMAX+1],sum[NMAX+1];int main(){int t,n,s;int l,r,mid;int mi;int ybz;int i;scanf("%d",&t);for(ybz=0;ybz<t;ybz++){scanf("%d%d",&n,&s);for(i=1;i<=n;i++){scanf("%d",a+i);sum[i]=sum[i-1]+a[i];}mi=n+1;for(i=1;i<=n;i++){l=0;r=i-1;while(l!=r){mid=(l+r)/2;if(sum[mid]+s>sum[i])r=mid;else l=mid+1;}if((l+1<i)&&(sum[l+1]+s<=sum[i])){if(i-l-1<mi)mi=i-l-1;}if(sum[l]+s<=sum[i]){if(i-l<mi)mi=i-l;}else{if((l-1>=0)&&(i-l+1<mi))mi=i-l+1;}}printf("%d\n",(mi==n+1)?0:mi);}return 0;
}

思路二:(膜拜神犇魏子卿)前缀和,利用答案单调性,时间复杂度O(n)O(n)

#include <cstdio>#define NMAX 100000int a[NMAX+1],sum[NMAX+1];int main(){int t,n,s;int mi;int i,j;for(scanf("%d",&t);t;t--){scanf("%d%d",&n,&s);for(i=1;i<=n;i++){scanf("%d",a+i);sum[i]=sum[i-1]+a[i];}mi=n+1;j=0;for(i=1;i<=n;i++){for(;sum[i]-sum[j+1]>=s;j++);//printf("%d %d\n",i,j);if((sum[i]-sum[j]>=s)&&(i-j<mi))mi=i-j;}printf("%d\n",(mi==n+1)?0:mi);}return 0;
}

尾声

看清题!看清题!看清题!
充智商!充智商!充智商!

CCNU ACM 2016夏季集训·day3比赛相关推荐

  1. CCNU ACM 2016夏季集训·day1比赛

    表示这比赛坑好多-- 题目页面 咳,总之在各种特殊的wa姿势之间摸爬滚打终于完成了这8道题-- 题解时间到~ A 最小公倍数 求a1a_1,a2a_2,-,ana_n共n个数的最小公倍数. 关键:若x ...

  2. CCNU ACM 2016夏季集训·最长递增子序列(LIS)

    这几天dp写得难受-- 在讨论这个问题之前,首先明确:"子序列"是指从原序列中挑选出若干元素,按照原序列中的顺序组成新的序列(区别于"子串",即从原序列中挑选连 ...

  3. xor 2016 国庆集训day3

    题目:给出 n 个数 a 1 ..a n ,求 a i xor a j , (i不等于j) 的最大值 • 对于 30% 的数据,n ≤ 1000. • 对于另外 20% 的数据,数据保证最后的 ans ...

  4. 中南大学计算机学院盛羽,中南大学、新疆大学ACM暑期联合集训营顺利开营

    本网讯 7月21日上午,中南大学.新疆大学ACM暑期联合集训营在校本部科技楼实验室顺利开营.由新疆大学软件学院副院长王新辉作为领队的15名新大师生与中南大学ACM集训队学生共同参加了开营仪式,计算机学 ...

  5. 2016年CCPC/ICPC比赛总结

    2016:我大一升入大二. 队友:GLY,WZK. 队名:开心就好(MyHappinessIsAll) 菜鸡战绩:5月省赛二等,9月东北四省赛二等,9月CCPC长春打铁,10月ICPC沈阳压线铜牌. ...

  6. 2016清华集训滚粗记

    DAY-1 白天还要去上学... 晚上吃了顿火锅就直接去火车站了... 都没有时间陪妹子看<你的名字>! 上火车之前好像知道了在绵阳发生的一些奇怪的事情... 在火车上和光老师周鹏还有jk ...

  7. 2016暑假集训小结

    小结 暑假集训之前,有很多事情在忙,什么考试,**之类.集训开始的时候还回了一趟家,这趟回家也发生了对我影响最大的事,之后想了很久,觉得也还是有必要继续走下去,因为我还是很爱这个集训队,很爱思考题解题 ...

  8. 2016暑假集训总结

    Preface 这是蒟蒻lyd729在初二升初三的暑假里训练的总结. 来看看一年前的lyd729写的暑假集训总结(链接),真是觉得自己长大了好多. 这一年发生了太多故事.(我来讲故事啦) 去年,一升初 ...

  9. 【AHOI 2016初中组】 自行车比赛 - 贪心

    题目描述 小雪非常关注自行车比赛,尤其是环滨湖自行车赛.一年一度的环滨湖自行车赛,需要选手们连续比赛数日,最终按照累计得分决出冠军.今年一共有 N 位参赛选手.每一天的比赛总会决出当日的排名,第一名的 ...

最新文章

  1. 视学AI,这群大学生做了个牛逼的项目!
  2. springboot中radis配置和使用【进阶二】
  3. foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块
  4. CS08 用户服务工程师(青岛)
  5. linux备份能压缩吗,Linux备份与压缩命令
  6. suse linux11 包括所有的linux操作系统的 遗忘root密码解决方案
  7. 数据仓库和数据库有什么区别
  8. 数据结构——>线索化二叉树
  9. 联想拯救者Y7000P的一些功能键
  10. AxureRP8.1(注册码)破解汉化教程
  11. 10款UI设计师常用的UI设计工具盘点
  12. 如何查看台式机计算机网络密码,如何在电脑上查找当前的WiFi网络密码
  13. Tempo - 分布式Loki链路追踪利器
  14. 人保爱无忧易核版重疾险怎么样?好不好?
  15. 阿里云验证码与通知短信
  16. ZooKeeper audit is enabled. Exiting JVM with code 4
  17. 适合大学生浏览的网站
  18. 在职研究生计算机科学与技术考研考哪些科目,计算机在职研究生考试科目
  19. NFT 的未来:对真实用例的可视化探索
  20. 系统怎么设计usb启动_在启动中启动设计系统

热门文章

  1. macOS 无法验证此App不包含恶意软件
  2. Java反应式框架Reactor中的Mono和Flux,Java程序员必看
  3. 在Windows下搭建Teamspeak3服务器
  4. DSPACE的道路报错问题
  5. linux浏览器,邮件客户端,输入法,双屏设置,应用软件,gnome-screenshot/scrot -s截图,office...
  6. python表示逻辑与运算的关键字_Python 逻辑与位运算
  7. Premiere 2.0至Premiere CS5.5高清插件MainConcept(已破解)提供115网盘下载地址
  8. 网页设计有什么标准?细说网页设计的6大规范
  9. conio.h -1
  10. 集成学习bagging, boosting, stacking