HDU 5191 第一次bestcoder第二题
来源:互联网 发布:魔兽世界for mac 国服 编辑:程序博客网 时间:2024/06/07 04:57
第一次刷bestcoder要不要这么虐我。。
赛场上想的天荒地老也没有思路。。第二天打开电脑想了5分钟就有解决方法了。。。想用线段树解决。。原谅我年少无知不会算递归的复杂度。。结果无情TLE。。。 于是想到用数组解决。。
思路很简单。。写起来却很艰难。。可能是太久没有刷题了吧。。
接下来就是无限WA。。各种找数据比对。。。在午休后汇编课临上课前最后认真检查了一遍代码。。改了两处小错误。。终于AC了。。
26次提交也创下我的记录了。。。
代码冗长且复杂。。。不建议人类阅读。。。这辈子都不想看这堆代码了。。。
#include<stdio.h>#include<math.h>#include<iostream>#include<algorithm>#include<string.h>#define MAX 50050#define ll long longusing namespace std;pair<ll,ll> tool[MAX<<1]; //first 表示当前需要几块积木 //second 表示组合过程中消耗的积木数ll source[MAX];ll mabs(ll a){ if(a<0) a=-a; return a;}int main(){ //freopen("data.txt","r",stdin); ll N,W,H; int beacon; while(~scanf("%I64d%I64d%I64d",&N,&W,&H)) { beacon=1; ll temp; ll sum=0; //用于判断是否-1 memset(tool,0,sizeof(tool)); for(int i=1;i<=N;i++) { scanf("%lld",&temp); sum+=temp; source[i]=H-temp; ll a=tool[i-1].first; ll b=source[i]; //printf("%d %d %d\n",a,b,(a^b)<0); tool[i].second=((a^b)<0)?(tool[i-1].second+min(mabs(a),mabs(b))):(tool[i-1].second); tool[i].first=tool[i-1].first+source[i]; if(i>W) //小心N,W,H的大小对判断的影响 { ll c=tool[i].first; tool[i].first=tool[i].first-source[beacon]; ll a=tool[i].first; ll b=source[beacon]; tool[i].second=((a^b)<0)?(tool[i].second-min(mabs(a),mabs(b))):((mabs(c)>mabs(b))?(tool[i].second):(tool[i].second-mabs(a))); beacon++; } //printf("tool[i].second=%d*******\n",tool[i].second); } // printf("%d*****",sum); if(sum<W*H) { printf("-1\n"); continue; } for(int i=N+1;beacon<N;i++) //留意比较积木全在外面的情况 { tool[i]=tool[i-1]; ll c=tool[i].first; tool[i].first=tool[i].first-source[beacon]; ll a=tool[i].first; ll b=source[beacon]; tool[i].second=((a^b)<0)?(tool[i].second-min(mabs(a),mabs(b))):((mabs(c)>mabs(b))?(tool[i].second):(tool[i].second-mabs(a))); beacon++; //printf("tool[i].second=%d*******\n",tool[i].second); } ll ans=10000000000;// if(N>W)// {// printf("\n");// for(int i=1;i<=N+W-1;i++)// printf("%lld %lld #####\n",tool[i].first,tool[i].second);// printf("\n");// }// else// {// printf("\n");// for(int i=1;i<=N*2-1;i++)// printf("%lld %lld ####\n",tool[i].first,tool[i].second);// printf("\n");// } if(N>W) //tool 的长度为: W>N N*2-1 N>W N+W-1 { for(int i=1;i<=N+W-1;i++) { if(i<W) { if(tool[i].first<0) { ans=min(ans,tool[i].second+max(-tool[i].first,H*(W-i))); } else { ans=min(ans,tool[i].second+H*(W-i)+tool[i].first); } } else if(i<=N) { ans=min(ans,tool[i].second+mabs(tool[i].first)); } else { if(tool[i].first<0) { ans=min(ans,tool[i].second+max(-tool[i].first,H*(i-N))); } else { ans=min(ans,tool[i].second+H*(i-N)+tool[i].first); } } } } else { for(int i=1;i<=(N*2-1);i++) { if(i<=N) { if(tool[i].first<0) { ans=min(ans,tool[i].second+max(-tool[i].first,H*(W-i))); } else { ans=min(ans,tool[i].second+H*(W-i)+tool[i].first); } } if(i>=N) { if(tool[i].first<0) { ans=min(ans,tool[i].second+max(-tool[i].first,W*H-H*(2*N-i))); } else { ans=min(ans,tool[i].second+W*H-H*(2*N-i)+tool[i].first); } } } } ans=min(ans,W*H); printf("%I64d\n",ans); } return 0;}
0 0
- HDU 5191 第一次bestcoder第二题
- hdu 5500 Reorder the Books 【BestCoder Round #59 (div.2) 第二题】
- 第一次打bestcoder #72
- RFID第一次作业第二题
- hdu 4908 BestCoder Sequence (思维题)
- HDU-4908-BestCoder Sequence【思维题】
- BestCoder Round #92 第一次BC
- BestCoder Round #43 第二题 pog loves szh II
- HDU BestCoder 1001
- hdu 4908 BestCoder Sequence
- hdu 4908 BestCoder Sequence
- HDU 4908 BestCoder Sequence
- hdu 4908 BestCoder Sequence
- HDU 4908 BestCoder Sequence
- hdu 4908 BestCoder Sequence
- hdu 4908 BestCoder Sequence
- 【BestCoder】HDU 5199 Gunner
- HDU 4908 BestCoder Sequence
- Ubuntu下的配置LAMP
- jquery 事件注册 与重复事件处理
- drivers_day10
- HTML个人简历表制作
- 【转】WindowManager$BadTokenException: Unable to add window -- token null is not for an application
- HDU 5191 第一次bestcoder第二题
- acm DP经典题目 滑雪问题 【DP 记忆化搜索 递归】
- [刷题]Binary Search
- drivers_day11
- ios图片压缩
- 鼎泰移民向您介绍香港理工大学
- Web前端UI(含移动端)
- 第三章 文件 I/O
- Drainage Ditches (poj 1273 && hdu 1532 网络流之Ford-Fulkerson)