Showstopper

  题目大意:数据挖掘是一项很困难的事情,现在要你在一大堆数据中找出某个数重复奇数次的数(有且仅有一个),而且要你找出重复的次数。

  其实我一开始是没读懂题意的。。。主要是我理解错object的意思了- -

  这一题原理要做出来不难,其实就是二分法,对数二分就好了,因为重复奇数次的数只有一个,所以肯定存在小于等于某一个数时的数的重复次数加起来是奇数,不断二分就可

  关键是是这一题的数据输入超级麻烦,他还会隔行输入。。。。用一行或者多行来区分数据。。。一开始我跳进这个坑里面了。。出题人有意思吗?

  不过还好,让我重新复习了sscanf的用法。。。网上找了个用法比较好的做范例吧。

  

 #include <iostream>
#include <functional>
#include <algorithm>
#include <string.h> typedef long long LL_INT; struct _set
{
LL_INT set_att[];
}refer[]; void Solve(const int, LL_INT);
LL_INT Max(LL_INT, LL_INT);
bool judge(LL_INT, const int);
int Cal_Sum(const int, LL_INT); int main(void)//找出某个数出现的次数为奇数次的数
{
int sum = ;
LL_INT max_num;
char str[]; while (gets(str))
{
sum = ; max_num = -; refer[].set_att[] = ;
sscanf(str, "%lld %lld %lld", &refer[].set_att[], &refer[].set_att[], &refer[].set_att[]);
if (refer[].set_att[] == )
continue;
memset(str, , sizeof(str));
do{
sum++;
gets(str);
if (str[] == ) break;
sscanf(str, "%lld %lld %lld", &refer[sum].set_att[], &refer[sum].set_att[], &refer[sum].set_att[]);
memset(str, , sizeof(str));
max_num = Max(max_num, refer[sum].set_att[]);
} while ();
Solve(sum, max_num);
}
return EXIT_SUCCESS;
} LL_INT Max(LL_INT x, LL_INT y)
{
return x > y ? x : y;
} int Cal_Sum(const int i, LL_INT ans)
{
if (ans<refer[i].set_att[] || ans>refer[i].set_att[])
return ;
else if ((ans - refer[i].set_att[]) % refer[i].set_att[] == )
return ;
else return ;
} void Solve(const int set_sum, LL_INT max_num)
{
LL_INT lb = , ub = max_num, mid, res = ; while (ub - lb > )
{
mid = (lb + ub) >> ;
if (judge(mid, set_sum)) ub = mid;
else lb = mid;
}
for (int i = ; i < set_sum; i++)
res += Cal_Sum(i, ub);
if (res % )
printf("%lld %lld\n", ub, res);
else
printf("no corruption\n");
} bool judge(LL_INT mid, const int set_sum)
{
//只用统计mid(包含mid)的半边就可以了,因为出现奇数次的数只有一个
LL_INT refer_sum = ;
for (int i = ; i < set_sum; i++)
{
if (mid < refer[i].set_att[])//没有任何数出现在左边
continue;
else if (mid > refer[i].set_att[])
refer_sum += (refer[i].set_att[]- refer[i].set_att[]) / refer[i].set_att[] + ;
else
refer_sum += (mid - refer[i].set_att[]) / refer[i].set_att[] + ;
}
return refer_sum % ? : ;
}

  

  参考http://blog.csdn.net/sd_invol/article/details/9410407

    http://blog.csdn.net/u012825876/article/details/27854225

最新文章

  1. 【hrbust2293】棋盘村
  2. PHPCMS V9教程之快速入门
  3. Objective-c——UI进阶开发第一天(UIPickerView和UIDatePicker)
  4. 遵循amd规范的require.js(适合浏览器端)
  5. sql 语句:给 text 数据类型排序
  6. &quot;QQ尾巴病毒&quot;核心技术的实现原理分析
  7. 11个实用经典的SQL小贴士
  8. Lua学习笔记(六):协程
  9. iOS 网络 -- cocoaPods 安装和使用教程
  10. 全局键盘钩子(WH_KEYBOARD)
  11. JQuery DataTable插件
  12. 按钮特效-Enter键自动提交表单
  13. 在Windows上远程运行Linux程序
  14. Java 逆变与协变的名词说明
  15. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
  16. 如何在MySQL中查询每个分组的前几名【转】
  17. Openssl源代码整理学习
  18. redhat7.3 superset的离线安装
  19. throws和throw抛出异常的使用规则
  20. 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

热门文章

  1. $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
  2. Express开发实例(2) —— Jade模板引擎
  3. 微信电脑版即将到来了 安装QQ浏览器微信版体验吧
  4. Ubuntu 14 常用“快捷键”,Ctrl + Alt + F1 进入终端,按 Ctrl + Alt + F7 回到界面
  5. Javascript高级程序设计——基本包装类型
  6. unslider.js源码
  7. 关于outerWidth()属性
  8. Java Io 流(输入输出流)
  9. 创建第一个JBPM6项目并且运行自带的helloword例子(JBPM6学习之三)
  10. iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView