数据范围:
所以直接双循环枚举就好。
#include <iostream>
using namespace std;
int t;
int a, b, c, d, k;
int main()
{
cin >> t;
while(t--)
{
bool flag = false;
int n, m;
cin >> a >> b >> c >> d >> k;
for(int i = k; i >= 0; i--)
for(int j = k - i; i + j <= k; j++)
{
if(i * c >= a && j * d >= b)
{
n = i, m = j; // 记录合法的 i,j值
flag = true;
break;
}
}
if(flag) cout << n << " " << m << " " << endl;
else puts("-1");
}
return 0;
}
因为 只与
有关,所以只要记录
,在
上加减1就可。并且优先减去
大的数。
所以只要每次找到最大的 进行操作。
另外,如果数组已经全部为0了,剩余操作次数 k 对 的影响只会是 0 或 1,显然,k为偶数时
为0, 否则为1。
注意:由于数据范围为 ,
, 并且需要计算平方,所以会爆 int, 需要开 long long。n的范围只有1000,所以每次只要循环找到最大值即可。
要找到最大值,所以第一反应用堆来写,但是由于数据范围只有 1000,所以用数组存下每个数据后,用循环遍历选择最大值也是可行的
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 1010;
int n, k1, k2;
long long a[N], b[N], c[N];
int main()
{
cin >> n >> k1 >> k2;
priority_queue<long long> heap;
long long res = 0; // 记录最后答案
int m = k1 + k2; // 操作次数共用
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n; i++) cin >> b[i];
for(int i = 0; i < n; i++) heap.push(abs(a[i] - b[i]) ); // 计算 |ai - bi|
while(m)
{
if(heap.top() == 0) break; // 堆顶为 0,则堆中所有元素为 0
auto t = heap.top();
heap.pop();
t--, heap.push(t);
m--;
}
if(m) // 循环结束时 m 不为 0
{
if(m % 2 == 0) res = 0;
else res = 1;
}
else
{
while(heap.size()) // 计算 |ai - bi|^2
{
long long t = heap.top();
heap.pop();
res += t * t;
}
}
cout << res << endl;
return 0;
}