http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1101

题目大意:

游戏开始时,他们各自将自己的赌注盖住,同时任何两个赌徒的赌注是不同的,如果其中一个赌徒没有钱了,他可以借一些筹码,但是他的赌注就是负数了。假设,他们的赌注都是整数。

然后他们揭开所有的赌注。赢家为:他的赌注是其他三个人的赌注的综合。如果赢家不止一家,那么拥有最大赌注的人是赢家。

算法分析:

对于此题,求三个数n1,n2,n3使其之和为另一个数字n。如果存在多种情况,求n值最大的一个。所以首先将所有的数字从小到大排列,从后向前求解,这样就保证求得的第一个赢家为最大值。

另外三个数就需要枚举了。三个赌徒,至少有一个在赢家(i)的前面(j),但是由于存在负数,所以另外两个赌徒的编号就有可能在赢家的后面,最初考虑这题的时候,忽略了这点(如果没有负数,三个赌徒肯定都在赢家的前面了)。另外就是如果三个数都要考枚举的话,算法复杂度就高了。但是由于前面已经对数组进行排序,所以可以先枚举其中两个(j,k),则第三个赌徒的赌注为tmp  = jetton[i] – jetton[j] – jetton[k]; 然后进行二分查找tmp,如果存在,则结束枚举就行了,这样可以降低算法复杂度,不过仍为O(n^3lgn)

#include<iostream>
#include<algorithm>
using namespace std;#define MAXN 1002int n,jetton[MAXN];int search(int k,int val)    //二分查找tmp
{int left,right,mid;left = k+1;    right = n-1;while(left<=right){mid = (left+right)>>1;if(jetton[mid] == val)    return mid;if(jetton[mid] < val)    left = mid+1;else right = mid-1;}return 0;
}int work()
{int i,j,k,tmp,pos;for(i=n-1;i>0;i--)//从后向前查找
    {for(j=0;j<i;j++)    //第一个
        {for(k=j+1;k<n;k++)    //第二个
            {tmp = jetton[i]-jetton[j]-jetton[k];pos = search(k,tmp);    //查找第三个是否存在if(pos && pos != i)    //如果符合要求,直接返回
                {return i;}}}}return -1;
}int main()
{int i;while(cin>>n && n){for(i=0;i<n;i++)cin>>jetton[i];sort(jetton,jetton+n);    //从小到大排列int ans = work();if(ans==-1)    cout<<"no solution"<<endl;else cout<<jetton[ans]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/pcoda/archive/2012/09/02/2667981.html

ZOJ-1101-Gamblers相关推荐

  1. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  2. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  3. ZOJ 题目分类,学校的一个巨巨做的。

     DP: 1011      NTA                    简单题 1013      Great Equipment        简单题 1024      Calendar ...

  4. c语言大小写字母互换1005,1005 Jugs,1005jugs

    1005 Jugs,1005jugs 辗转相减,新手入门题.两个容量的灌水题,无所谓最优解. 1 #include 2 3 intmain(){4 intA,B,T,sA,sB;5 while(sca ...

  5. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

  6. ACM POJ 题目分类(完整整理版本)

    DP: 1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题   ...

  7. PUK ACM题目分类

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  8. pku,zju题目分类

    哎呦喂,直接ctrl+A了.话说浙江大学的题还见过的呢.. 公告: [意见反馈][官方博客]   ural pku Zju 题目分类 收藏   感谢 mugu 的提供.... Ural Problem ...

  9. ZOJ POJ题目分类

    ZOJ题目分类 初学者题:1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

  10. 【ZOJ题目分类】备忘

    ZOJ 题目 分类 初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 ...

最新文章

  1. linux动态库命名规则
  2. java中关于时间的计算
  3. 数据驱动的未来城市八大趋势
  4. TCP和UDP可以同时监听相同的端口
  5. 用户访问网站的基本流程
  6. 汇编语言学习工具Dosbox的安装与配置(一)
  7. 分享一个自用的,随便找到的组件,留作记录
  8. C++中的explicit关键字用法
  9. java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码
  10. 散度与梯度在图像中的应用
  11. 有人说赚钱靠项目,也有人说赚钱靠技术
  12. plsql日期转换错ORA-01830
  13. 全网最!详!细!tarjan算法讲解
  14. harmonyos2.0刷机包,鸿蒙harmony os 2.0刷机包|鸿蒙harmony os 2.0系统刷机包 v1.021-520下载站...
  15. ctfshow 做题 MISC入门 模块 31-40
  16. (官网)虚幻3--基础游戏快速入门
  17. 小象学院人工智能机器学习全新升级版
  18. (Java实现) 美元汇率
  19. 微信怎么彻底删除微信消息?
  20. 哈希表哪家强?编程语言找你来帮忙

热门文章

  1. Spring Cloud(6.1):搭建OAuth2 Authorization Server
  2. 8、Python MySQL - mysql-connector 驱动
  3. Django两天搭建个人博客
  4. Android Studio升级后报 method not found: 'runProguard'的错误
  5. [转]php获取含中文字符串长度
  6. 【酒桌文化】座次、上菜、喝酒的规矩
  7. linux系统路由功能记录
  8. vim语法高亮的错误解决办法
  9. 发送临时文件被服务器拒绝,临时会话说服务器拒绝了您发送离线文件的请求 - 卡饭网...
  10. Linux 系统中的定时任务及延时任务