• poj 1759 二分搜索


    题意:N个等差数列,初项X_i,末项Y_i,公差Z_i,求出现奇数次的数?

    思路:

    1. 因为只有一个数出现的次数为奇数个
    2. 假设 第二个数字的个数为 奇数个,其余全部都是偶数个 ,累计出现的次数

                      a1偶数

                     a1+a2 奇数 

                    a1+a2+a3 奇数

                     ...................

    会出现这种情况:偶偶偶...偶奇

    第一个出现奇的就是我们想要的

    解决问题的代码:

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    #include <cstring>
    using namespace std;
    #define maxn 50010
    typedef long long ll;
    ll x[maxn], y[maxn], z[maxn];
    int cnt;
    char s[maxn];
    ll judge(ll mid)
    {
            ll sum = 0;
            for (int i = 0; i < cnt; i++)
            {
                   if (mid < x[i]) continue;
                   ll t = min(mid, y[i]);
                   sum += (t - x[i]) / z[i] + 1;
            }
            return sum;
    }
    void solve()
    {
            cnt = 1;
            x[0] = 0;
            sscanf(s, "%lld%lld%lld", &x[0], &y[0], &z[0]);
            if (!x[0]) return;
            
            while (gets_s(s) && s[0])
            {
                   sscanf(s, "%lld%lld%lld", &x[cnt], &y[cnt], &z[cnt]);
                   cnt++;
            }
            ll l = 0, r = 1ll << 32;
            while (l < r)
            {
                   ll mid = (l + r) / 2;
                   if (judge(mid) % 2) r = mid;
                   else l = mid + 1;
            }
            if (l == 1ll << 32) printf("no corruption
    ");
            else printf("%lld %lld
    ", l, judge(l) - judge(l - 1));
    }
    int main()
    {
            while (gets_s(s))
                   solve();
            return 0;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    遮罩层代码
    get方法传递中文数据的时候如何进行转码
    Eclipse常用快捷键
    VS常用快捷键
    Java笔记10-Object包装类型字符串
    MySQL常用命令
    Oracle笔记3-高级查询
    Oracle笔记2-数据库设计
    Java笔记9-正则表达式
    Java笔记8-抽象接口
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9425967.html
Copyright © 2020-2023  润新知