对于algorithm102的总结
来源:互联网 发布:unity3d粒子特效教程 编辑:程序博客网 时间:2024/06/16 15:26
今天进行了NOIP第二次模拟比赛,即algorithm102……
友情链接:
【题解】国庆节集训Algorithm102 By Tonyzhao
【模拟测试】Algorithm102 By Ciel
测试概况
话不多说,开始分析题目:
T1 腿
考查知识点:小学奥数
题目大意:一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物.如果没有满足要求的答案,则输出两个0。
水题
因为只有兔子和鸡,所以腿数一定为偶数条,若为奇数,就输出0 0;
最多动物的情况:全是鸡;
最少动物的情况:看看腿数能凑出几只兔子,然后再用鸡填;
AC
#include<cstdio>#include<algorithm>using namespace std;int ans;int main(){ freopen("leg.in","r",stdin); freopen("leg.out","w",stdout); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int m; scanf("%d",&m); if(m%2==1) { printf("0 0\n"); } else { printf("%d %d\n",m/4+m%4,m/2); } }}
T2 午睡音乐
考查知识点:二分查找+前缀和;
题目大意:老师会弹奏一些单调的音阶组成的音乐。已知第 i 个音阶要弹奏 bi 次,才会弹奏下一个音阶,总共有 N 个音阶。老师会从第 0 时刻开始弹奏,小朋友们听着单调的音阶就会慢慢入睡。 现在有 Q 个询问,询问时间段 [ T, T+1 ) 内老师弹奏的是第几个音阶?
如图,第一个音阶持续2个时间单位,第二个音阶持续1个时间单位,第三个音阶持续3个时间单位。下面是一些询问和回答:
这道题的本质是在一个递增序列中找到第一个大于x的数;
所以我们想到了二分查找;
AC
#include<cstdio>#include<algorithm>using namespace std;int a[50100];long long sum[50100];int n,q;int fen(int tmp){ int l=1; int r=n; while(l<r) { int mid=(l+r)>>1; if(tmp>sum[mid]){l=mid+1;} else if(tmp<sum[mid]){r=mid;} else {return mid;} } return l;}int main(){ freopen("music.in","r",stdin); freopen("music.out","w",stdout); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=q;i++) { int nmp; scanf("%d",&nmp); int ans=fen(nmp+1); if(nmp+1==sum[n])ans=n; printf("%d\n",ans); }}
T3 线段
考查知识点:DP;
题目大意:对于每个线段都有不同的价值,且两端都是整数坐标。~~想从 N 条线段中挑选出若干条,并且这些线段不出现覆盖(端点可以重合),使得这些线段的价值总和最大。
首先按线段右端点由小到大的顺序排序;
然后动态规划:
F[i]:表示前i个区间所获得的最大价值
F[i]=max{ F[i] , F[j]+w[i] };
其中满足:e[j].y<=e[i].x;
需要注意,j的枚举范围要从0开始,也就是把第i个区间当成第一个选择的区间;
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int n,ans,f[1010];struct your { int x,y,z;}e[1010];bool cmp(your a,your b){ if(a.x!=b.x) return a.x<b.x; return a.y<b.y;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z); } sort(e+1,e+1+n,cmp); for(int i=1;i<=n;i++) { for(int j=0;j<i;j++) { if(e[j].y<=e[i].x) { f[i]=max(f[i],f[j]+e[i].z); } } } for(int i=1;i<=n;i++) { ans=max(ans,f[i]); } printf("%d",ans); return 0;}
- 对于algorithm102的总结
- 对于编程的总结
- 对于异常的总结
- 对于 gevent 的总结
- 对于poll的总结
- 对于algorithm101的总结
- 对于检索的总结
- 对于背包的总结
- 对于DWR的简单总结
- 对于DWR的简单总结
- 对于格式化字符串的总结
- 对于Hibernate的一些总结
- 对于ARWU大学排名的总结
- 对于form表单的总结
- 对于格式化字符串的总结
- 对于二分匹配的总结
- 对于抽象类的总结
- 对于异常的学习总结
- Servlet 基础
- Android数据库中getReadableDatabase() 和 getWritableDatabase()的区别
- Oracle创建一个表 如果不指定表空间 是不是就是用默认的system表空间
- 数据库连接池浅析
- 【USACO题库】1.4.2 The Clocks时钟.TJ
- 对于algorithm102的总结
- 递归与迭代的区别与联系
- RHEL/Centos---网络配置详解
- 约瑟夫问题(80)
- iOS 关闭textField的粘贴 选择 全选等对内容操作的菜单
- matlab-cat函数
- JSP学习第二天--PPT演示
- 保存时检测窗体上控件中的数据是否发生变化 asp
- html 绘制太极