|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述:
小明是学校里的一名老师,他带的班级共有 n 名同学,第 i 名同学力量值为 ai。在闲暇之余,小明决定在班级里组织一场拔河比赛。
为了保证比赛的双方实力尽可能相近,需要在这 n 名同学中挑选出两个队伍,队伍内的同学编号连续:{al1, al1+1, ..., ar1−1, ar1} 和 {al2, al2+1, ..., ar2−1, ar2},其中 l1 ≤ r1 < l2 ≤ r2。
两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可能相近。请计算出力量值之和差距最小的挑选队伍的方式。
【评测用例规模与约定】
对于 20% 的评测用例,保证 n ≤ 50。
对于 100% 的评测用例,保证 n ≤ 1e3,ai ≤ 1e9。
说一下我的思路:
把数组从小到大排列好。对于这个已经排列好的数组而言,有一个头指针top,一个尾指针rear,还有一个mid指针 =(top + rear) / 2 。
将从top加到mid的值即为lef,mid加到rear的值记录为rig
如果lef<rig,则记录temp = rig-lef
如果lef>=rig,则判断temp,lef-rig谁更小,输出小的那一个
但是不知道为什么只能过10%的数据,希望各位大佬能够帮小萌新解惑
以下是源代码- //////////
- //////////#include<bits/stdc++.h>
- //////////using namespace std;
- //////////
- //////////static int N = 1e5;
- //////////int str;
- //////////int end1;
- //////////int length;
- //////////bool isPrime(int n) //为true时为素数
- //////////{
- ////////// if (n < 2)
- ////////// return false;
- ////////// for (int i = 2;i * i <= n;i++)
- ////////// {
- ////////// if (n % i == 0)
- ////////// return false;
- ////////// }
- ////////// return true;
- //////////}
- //////////
- //////////int Prime()
- //////////{
- ////////// vector<bool>flag(N);
- ////////// vector<int>st;
- ////////// cin >> str >> end1;
- ////////// for (int i = str;i <= end1;i++)
- ////////// {
- ////////// st.push_back(i);
- ////////// }
- ////////// length = st.size();
- ////////// for (int i = 0;i < length;i++)
- ////////// {
- ////////// if (isPrime(st[i]))//isPrime为真的时候是素数
- ////////// {
- ////////// flag[i] = true;
- ////////// for (int j = 1;j * st[i] <= st[length - 1];j++)
- ////////// {
- ////////// flag[j*st[i]] = false;
- ////////// }
- ////////// }
- ////////// }
- ////////// for (int i = 0;i < length;i++)
- ////////// {
- ////////// if (flag[i])
- ////////// cout << st[i] << " ";
- ////////// }
- ////////// puts("");
- ////////// return 0;
- //////////}
- //////////
- //////////
- //////////int main()
- //////////{
- ////////// ios::sync_with_stdio(0);
- ////////// cin.tie(0);
- ////////// cout.tie(0);
- ////////// int i =1;
- ////////// cin >> i;
- ////////// while (i--)
- ////////// Prime();
- ////////// return 0;
- //////////}
- //////////
- ////////#include <iostream>
- ////////#include <vector>
- ////////#include <cmath>
- ////////using namespace std;
- ////////
- ////////void sieveOfEratosthenes(int start, int end1) {
- //////// vector<bool> isPrime(end1 - start + 1, true);
- //////// for (int i = 2; i * i <= end1; ++i) {
- //////// for (int j = max(2, (start + i - 1) / i) * i; j <= end1; j += i) {
- //////// isPrime[j - start] = false;
- //////// }
- //////// }
- //////// for (int i = max(2, start); i <= end1; ++i) {
- //////// if (isPrime[i - start]) {
- //////// cout << i << " ";
- //////// }
- //////// }
- //////// cout << endl;
- ////////}
- ////////
- ////////int main() {
- //////// int t;
- //////// cin >> t;
- //////// while (t--) {
- //////// int start, end1;
- //////// cin >> start >> end1;
- //////// sieveOfEratosthenes(start, end1);
- //////// }
- //////// return 0;
- ////////}
- //////全排列
- //////
- //////#include<bits/stdc++.h>
- //////using namespace std;
- //////typedef long long ll;
- //////int st[10];
- //////bool ise[10];
- //////int num = 3;
- //////
- //////void dfs(int step) //好像又犯了相同的错误
- //////{
- ////// //一定要明确每个参数的意义
- ////// //边界条件
- ////// if (step == num+1)
- ////// {
- ////// for (int i = 1; i < step;i++)
- ////// {
- ////// cout << st[i];
- ////// }
- ////// cout << endl;
- ////// return ;
- ////// }
- ////// //循环条件
- ////// for (int i = 1;i < num + 1;i++)//切记i表示的是手中的牌
- ////// {
- ////// if (!ise[i])
- ////// {
- ////// st[step] = i;
- ////// ise[i] = true;
- ////// dfs(step + 1);
- ////// ise[i] = false;
- ////// }
- ////// }
- //////}
- //////void solve()
- //////{
- ////// dfs(1);
- //////}
- //////
- //////int main()
- //////{
- ////// ios::sync_with_stdio(0);
- ////// cout.tie(0);
- ////// cin.tie(0);
- ////// int i = 1;
- ////// while (i--)
- ////// solve();
- ////// return 0;
- //////}
- ////
- ////#include<bits/stdc++.h>
- ////using namespace std;
- ////#define int long long
- ////#define endl '\n'
- ////#define pp ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
- ////const int N = 1e5 + 1;
- ////vector<int>a[N];
- ////int s[N];
- ////int n;
- ////void solve() {
- //// pp;
- //// cin >> n;
- //// for (int i = 0;i < n;i++)cin >> s[i];
- //// sort(s, s + n);//s表示h
- //// for (int i = 0;i < n;i++)
- //// {
- //// for (int j = 1;j <= sqrt(s[i]);j++)
- //// {
- //// if (s[i] % j == 0)
- //// {
- //// a[j].push_back(s[i]);
- //// //需要在满足是因子的基础上判断是否是乘方因子,放在外面是错的
- //// if (s[i] / j != j)
- //// a[s[i] / j].push_back(s[i]);
- //// }
- //// }
- //// }
- ////
- //// for (int i = N - 1;i >= 0;i--)
- //// {
- //// if (a[i].size() >= 3)
- //// {
- //// cout << a[i][0];
- //// for (int j = 1;j < 3;j++)cout << " " << a[i][j];
- //// break;
- //// }
- //// }
- //// return;
- ////}
- ////
- ////signed main() {
- //// int T = 1;
- //// while (T--)solve();
- //// return 0;
- ////}
- ////
- //
- //
- ////不会写就暴力
- //#include <iostream>
- //#include<vector>
- //#include<algorithm>
- //using namespace std;
- //typedef long long ll;
- //ll temp;
- //int cmp(ll x,ll y)
- //{
- // return x > y;
- //}
- //void solve()
- //{
- // ll n, p, q;
- // cin >> n>>p>>q;
- // vector<ll>a(n);
- // {
- // for (ll i = 0;i < n;i++)
- // {
- // cin >> a[i];
- // }
- // }
- // ll ans = 0;
- // sort(a.begin(), a.end());
- // for (temp = n - 1;temp > n - q - 1;temp--)
- // {
- // a[temp] = sqrt(a[temp]);
- // }
- // sort(a.begin(), a.end(),cmp);
- // for (ll i = 0;i < q;i++)
- // {
- // a[i] = a[i] / 2;
- // }
- // for (ll i = 0;i < n;i++)
- // {
- // ans += a[i];
- // }
- // cout <<ans;
- //}
- //int main()
- //{
- // ios::sync_with_stdio(0);
- // cin.tie(0);
- // cout.tie(0);
- // int i = 1;
- // while (i--)
- // {
- // solve();
- // }
- //}
- //拔河,简单解法
- #include<iostream>
- #include<math.h>
- #include<algorithm>
- #include<vector>
- using namespace std;
- typedef long long ll;
- #define def(x) cout<<x
- #define endl '\n'
- #define M 0x3f3f3f3f3f3f3f3f
- //const int N = 10e3 + 10;
- ll num;
- //int a[N]; //这边有点问题,数组太大了怎么办?
- void solve()
- {
-
- cin >> num;
- vector<ll>a;
- ll temp;
- for (ll i = 0;i < num;i++)
- {
- cin >> temp;
- a.push_back(temp);
- }
- sort(a.begin(), a.end());
- ll top = 0, rear = num - 1;
- ll mid = (top+rear)/2;
- ll lef, rig;
- ll temp1 = 0;
- while (1)
- {
- //每次更新的时候进行重置
- lef = 0;
- rig = 0;
- for (ll i = 0; i < mid; i++)
- {
- lef += a[i];
- }
- for (ll i = mid;i <= rear;i++)
- {
- rig = rig + a[i];
- }
- //只要少给一个,右边一定大
- if (lef >= rig )
- {
- if (temp1 < lef - rig)
- {
- def(temp1);
- }
- else
- {
- def(lef - rig);
- }
- return;
- }
- temp1 = rig - lef;
- mid++;
- }
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t = 1;
- while (t--)
- {
- solve();
- }
- return 0;
- }
复制代码
|
|