问一下各位佬,为什么这段代码只能过10%的数据?
题目描述:小明是学校里的一名老师,他带的班级共有 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))//isPrime为真的时候是素数
////////// {
////////// flag = true;
////////// for (int j = 1;j * st <= st;j++)
////////// {
////////// flag] = false;
////////// }
////////// }
////////// }
////////// for (int i = 0;i < length;i++)
////////// {
////////// if (flag)
////////// cout << st << " ";
////////// }
////////// 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 = false;
//////// }
//////// }
//////// for (int i = max(2, start); i <= end1; ++i) {
//////// if (isPrime) {
//////// 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;
//////bool ise;
//////int num = 3;
//////
//////void dfs(int step) //好像又犯了相同的错误
//////{
////// //一定要明确每个参数的意义
////// //边界条件
////// if (step == num+1)
////// {
////// for (int i = 1; i < step;i++)
////// {
////// cout << st;
////// }
////// cout << endl;
////// return ;
////// }
////// //循环条件
////// for (int i = 1;i < num + 1;i++)//切记i表示的是手中的牌
////// {
////// if (!ise)
////// {
////// st = i;
////// ise = true;
////// dfs(step + 1);
////// ise = 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;
////int s;
////int n;
////void solve() {
//// pp;
//// cin >> n;
//// for (int i = 0;i < n;i++)cin >> s;
//// sort(s, s + n);//s表示h
//// for (int i = 0;i < n;i++)
//// {
//// for (int j = 1;j <= sqrt(s);j++)
//// {
//// if (s % j == 0)
//// {
//// a.push_back(s);
//// //需要在满足是因子的基础上判断是否是乘方因子,放在外面是错的
//// if (s / j != j)
//// a / j].push_back(s);
//// }
//// }
//// }
////
//// for (int i = N - 1;i >= 0;i--)
//// {
//// if (a.size() >= 3)
//// {
//// cout << a;
//// for (int j = 1;j < 3;j++)cout << " " << a;
//// 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;
// }
// }
// ll ans = 0;
// sort(a.begin(), a.end());
// for (temp = n - 1;temp > n - q - 1;temp--)
// {
// a = sqrt(a);
// }
// sort(a.begin(), a.end(),cmp);
// for (ll i = 0;i < q;i++)
// {
// a = a / 2;
// }
// for (ll i = 0;i < n;i++)
// {
// ans += a;
// }
// 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; //这边有点问题,数组太大了怎么办?
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;
}
for (ll i = mid;i <= rear;i++)
{
rig = rig + a;
}
//只要少给一个,右边一定大
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;
}
看起来你的代码逻辑出现了一些问题。首先,你的思路是正确的,需要将数组按升序排列,并找出两个队伍的分界点mid。但是在找到mid之后,你的代码逻辑出现了问题。
首先,temp1应该在while循环外面进行定义,否则每次循环都会重置为0,导致计算错误。
其次,你计算lef和rig的方式有误。对于lef,应该累加从top到mid的所有元素,而不是只累加a。同样地,rig也应该累加从mid+1到rear的所有元素。
最后,你的条件判断有误,应该判断temp1和abs(lef-rig)的大小关系,而不是temp1和lef-rig的大小关系。
下面是修改后的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a;
}
sort(a.begin(), a.end());// 对数组进行排序
int top = 0, rear = n - 1;
int mid = (top + rear) / 2;
int lef, rig;
int temp1 = 0;
while (1) {
lef = 0;
rig = 0;
for (int i = top; i <= mid; i++) {
lef += a;
}
for (int i = mid + 1; i <= rear; i++) {
rig += a;
}
if (temp1 < abs(lef - rig)) {
temp1 = abs(lef - rig);
} else {
break;
}
mid++;
}
cout << temp1 << endl;
}
int main() {
solve();
return 0;
}
现在你可以试着运行这段代码,并测试一下是否能够正确解决问题。如果还有其他问题,请随时向我提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]