HDU2795 Billboard 线段树
2015-08-26 15:12
323 查看
开始的代码,暴力求解。。。。。果断超时 #include <iostream> #include <cstdio> #include <string.h> using namespace std; const int maxn = 200005; int main() { int h, w, k, b; int a[maxn] ; bool flag; while(scanf("%d%d%d", &h, &w, &k) != EOF){ memset(a, 0, sizeof(a)); for(int j = 0; j < k; j++){ scanf("%d", &b); flag = false; for(int i = 1; i <= h; i++){ if(a[i] + b <= w) { a[i] += b; flag = true; printf("%d\n", i); break; } } if(!flag) printf("-1\n"); } } return 0; } 线段树求解 #include<iostream> #include<cstdio> using namespace std; const int N = 200005; int h,w,n; struct Tree { int l,r; int num; }tree[N<<2]; int minn(int h,int n) { if(h>n) return n; else return h; } int maxx(int a,int b) { if(a>b) return a; else return b; } void creat(int i,int l,int r) { int mid=(l+r)>>1; tree[i].l=l; tree[i].r=r; tree[i].num=w; if(l==r) return; creat(i<<1,l,mid); creat(i<<1|1,mid+1,r); } int query(int i,int len) { if(tree[i].l==tree[i].r) { tree[i].num-=len; return tree[i].l; } else { int sum1=0,sum2=0; if(len<=tree[i<<1].num) sum1=query(i<<1, len); else if(len<=tree[i<<1|1].num) sum2=query(i<<1|1,len); tree[i].num=maxx(tree[i<<1].num,tree[i<<1|1].num); //回溯 return sum1+sum2; } } int main() { while(scanf("%d%d%d",&h,&w,&n) != EOF) { int len; creat(1,1,minn(h,n)); for(int i=1;i<=n;i++) { scanf("%d",&len); if(tree[1].num>=len) printf("%d\n",query(1,len)); else printf("-1\n"); } } return 0; }
相关文章推荐
- POJ 2115 C Looooops(单变元模线性方程)
- malloc函数、free()
- UVA - 1658 Admiral (最小费用最大流)
- 10048 - Audiophobia (Floyd)
- 架构模式及要素
- SharePoint PowerShell命令系列 (5) New-SPSite
- [TYVJ1035] 棋盘覆盖|匈牙利算法|二分图匹配
- c语言, objective code(new 1)
- 安装php时,make test报错
- 设置TableViewCell 分割线从最左侧绘制
- Apache HttpClient 4.3开发指南 实现URL重定向
- Json解析方式
- 关于 hashCode() 你需要了解的 3 件事
- Tomcat指定JAVA_HOME而不用环境变量
- 最小生成树模板
- 纯css实现三角原理,兼容IE
- hbase meta表修复
- UVA 247 - Calling Circles (Floyd)
- Nginx加状态监控
- hadoop基础知识