HDU 5203 Rikka with wood sticks 分类讨论
2016-04-18 15:14
344 查看
题目链接:
hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5203bc(chinese):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=575&pid=1002
题解:
不断的分类讨论下去#include<algorithm> #include<iostream> #include<cstdio> using namespace std; const int maxn=1000+10; const int INF=0x3f3f3f3f; typedef long long LL; int n,m; int main(){ while(scanf("%d%d",&n,&m)==2&&n){ //找出bad stick的左右界限 int beg=INF,end=-1; for(int i=0;i<m;i++){ int x; scanf("%d",&x); beg=min(beg,x); end=max(end,x); } int l1=beg-1,l2=n-end; if(l1>l2) swap(l1,l2); LL ans=0; if(l1>0){ //截取的bad stick段在中间 for(int i=1;i<l2;i++){ int a=l1,b=i,c=l2-i; if(a+b>c&&a+c>b&&b+c>a) ans++; } }else{ //截取的bad stick段在两边 for(LL x=(l2+2)/3;x<(l2+1)/2;x++){ //枚举最长边为x的情况 LL tmp=3*x+1-l2,cnt=0;//tmp代表第一条边为x时的所有合法的情况(后两条边有考虑顺序,第一条边不考虑顺序) if(l2-2*x>0){ //最长边有可能存在两条的情况 if(l2-2*x==x){ //三条边相等(x,x,x) cnt=(tmp-1)*3+1; }else{ if(((l2-x)&1)==0){ //有两条边相等的情况(1、x,x,a(a<x);2、x,a,a(a<x)) cnt=(tmp-3)*3+3*1+3*1; }else{ //(x,x,a) cnt=(tmp-2)*3+3*1; } } }else{ //最长边不可能存在两条的情况 if(((l2-x)&1)==0){ //( x,a,a) cnt=(tmp-1)*3+3*1; }else{ //(x,b,a(b!=a)) cnt=tmp*3; } } ans+=cnt; } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- Unity开发Leapmotion
- swift单例创建的几种方法
- Mybatis高级映射
- 4456: [Zjoi2016]旅行者|分治+最短路
- Codeforces Beta Round #49 (Div. 2) E
- 怎么把word转成pdf文本文档
- 软考信息系统监理师,2016年4月15日作业:
- umount卸载一块盘,不让卸载怎么办
- Java中文编码问题深入分析
- XP系统通过Twain扫描提示成像设备无法初始化的解决方法
- Android版本微信头像剪裁与系统剪裁之间的选择
- java中如何将字符数组转换成字符串,以逗号分割
- 机器学习讲座总结-读图时代的识图技术
- js滚动页面到固定位置进行操作
- IOS汉字与UTF8码的互换
- Item 05:了解C++默默编写并调用哪些函数
- 深度探索C++关键字之 virtual
- Hbase表Scan方法获取rowkey
- String、StringBuffer与StringBuilder之间区别
- cygwin配置ssh免密码登入错误及其解决方法