• hdoj薛猫猫杯程序设计网络赛1003 球球大作战


    思路:

    二分,check函数不是很好写。

    实现:

    1.

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll INF = 0x3f3f3f3f3f3f3f3f;
     5 ll a[100005];
     6 int n, k;
     7 bool check(ll x)
     8 {
     9     int cnt = 0;
    10     ll sum = 0;
    11     for (int i = 1; i <= n; i++)
    12     {
    13         if (a[i] >= x) continue;
    14         sum = a[i++];
    15         while (i <= n && sum < x)
    16         {
    17             sum += a[i++]; cnt++;
    18         }
    19         if (i > n && sum < x) cnt++;
    20         i--;
    21     }
    22     return cnt <= k;
    23 }
    24 int main()
    25 {
    26     int T;
    27     cin >> T;
    28     while (T--)
    29     {
    30         ll l = INF, r;
    31         cin >> n >> k;
    32         for (int i = 1; i <= n; i++) 
    33         {
    34             cin >> a[i];
    35             l = min(l, a[i]);
    36             r += a[i];
    37         }
    38         ll ans = l;
    39         while (l <= r)
    40         {
    41             ll m = l + r >> 1;
    42             if (check(m))
    43             {
    44                 ans = m;
    45                 l = m + 1;
    46             }
    47             else r = m - 1;
    48         }
    49         cout << ans << endl;
    50     }
    51     return 0;
    52 }

    2.

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll INF = 0x3f3f3f3f3f3f3f3f;
     5 ll a[100005], b[100005];
     6 int n, k;
     7 bool check(ll x)
     8 {
     9     for (int i = 1; i <= n; i++) b[i] = a[i];
    10     int cnt = 0;
    11     for (int i = 1; i <= n; i++)
    12     {
    13         if (b[i] >= x) continue;
    14         b[i + 1] += b[i];
    15         cnt++;
    16     }
    17     return cnt <= k;
    18 }
    19 int main()
    20 {
    21     int T;
    22     cin >> T;
    23     while (T--)
    24     {
    25         ll l = INF, r;
    26         cin >> n >> k;
    27         for (int i = 1; i <= n; i++) 
    28         {
    29             cin >> a[i];
    30             l = min(l, a[i]);
    31             r += a[i];
    32         }
    33         ll ans = l;
    34         while (l <= r)
    35         {
    36             ll m = l + r >> 1;
    37             if (check(m))
    38             {
    39                 ans = m;
    40                 l = m + 1;
    41             }
    42             else r = m - 1;
    43         }
    44         cout << ans << endl;
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    C#把外部文件拖入PictureBox中
    DirectInfo.GetFiles返回数组的默认排序
    NULL在SQLServer数据库日志文件中的存储
    C#中用NamedPipe进程间通信
    punycode和中文相互转换
    C#事件和委托的基础知识模型
    反射APP_CODE下的类和方法
    [ListView.View=List]的垂直滚动条
    换个思路"SQL2005下字符串字段内的字符排序"
    mono for android 的ADB
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9973811.html
Copyright © 2020-2023  润新知