今天就做一道题吧,给自己也放个假
大概是给定一个n和一个k,让你构造出一个只有1和-1的序列,最终使得序列中相等的数字的个数的总和等于k
#include <iostream>
using namespace std;
int a[110];
void solve()
{
int n, k;
cin >> n >> k;
int zheng = 0, f = 0, fu = 0;
for (int i = 0; i <= 100; i++) // i表示要选i个正数
{
if (f == 1)
break;
for (int j = 0; j <= 100; j++) // 表示要选j个负数
{
if (a[i] + a[j] == k)
{
zheng = i;
fu = j;
if (fu + zheng == n)
{
f = 1;
break;
}
}
}
}
if (f == 0)
{
cout << "NO\n";
return;
}
cout << "YES\n";
for (int i = 1; i <= n; i++)
{
if (zheng > 0)
{
cout << 1 << " ";
zheng -= 1;
}
else
cout << -1 << " ";
}
cout << "\n";
return;
}
int main()
{
int T;
cin >> T;
a[1] = 0;
for (int i = 1; i <= 100; i++)
a[i + 1] = (i * i + i) / 2;
a[101] = 0x3f3f3f3f;
while (T--)
solve();
return 0;
}
可以求出来对应的n能获得的最大结果是多少,数据范围不大,可以直接打个表。
规律是1 3 6 10 15 ......
接下来,可以先求出来需要多少个正数以及负数,这里我直接循环求了一遍,要保证正数和负数的总数等于n。
题不算难,但还是卡主我了,感觉自己在一些细节上还是不太行
(幸好昨晚没打cf)