题目链接
补题挖坑
A
看样例猜数据,最小最大肯定有,然后那就再用最大减最小拿出来一共三个数字
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
ll t, n;
int main()
{
cin >> t;
while (t--)
{
vector<ll> a(7);
for(auto &i:a)
cin >> i;
sort(a.begin(), a.end());
cout << a[6] - a[0] - a[1] << ' ' << a[0] << ' ' << a[1] << endl;
}
return 0;
}
B
我感觉看见代码就知道为什么了
- 在前后输出头部和尾部
- 设立一个target,如果连的上就继续输出,连不上就输出target和当前需要输出的,相当于自己补了一个串
- 统计输出的个数,因为前端后端他没给的话看不出来,如果还差一个的话就随便输出一个字母
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
ll t, n;
int main()
{
cin >> t;
while (t--)
{
cin >> n;
vector<string> a(n - 2);
for (auto &i : a)
cin >> i;
char target = a[0][1];
int flag = 2;
cout << a[0][0];
for (int i = 1; i < n - 2; ++i)
{
if(a[i][0]==target)
{
cout << a[i][0];
flag++;
}
else
{
cout << target << a[i][0];
flag+=2;
}
target = a[i][1];
}
cout << a[n - 3][1];
// cout << endl
// << flag << endl;
if(flag!=n)
cout << 'a';
cout<< endl;
}
return 0;
}
C
需要验证找到一个数使得除整个数组后可以有规律:除不尽:除尽:除不尽:除尽…以此类推
- 直接找奇偶位置的gcd
- 如果相当肯定不行
- 如果不想当就试试看看相邻两个是否会符合条件
- 这里需要注意的是是否会相等要用
__gcd(a,b) % target_num == 0 ?
,这里要记住因为可能有大数字,其他的就没啥了 - cf里面longlong都给我用起来
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
ll t, n;
int main()
{
cin >> t;
while (t--)
{
cin >> n;
vector<ll> a(n);
for (auto &i : a)
cin >> i;
ll num1 = a[0];
ll num2 = a[1];
for (int i = 0; i < n; i += 2)
num1 = __gcd(num1, a[i]);
for (int i = 1; i < n; i += 2)
num2 = __gcd(num2, a[i]);
// cout << num1 << ' ' << num2 << endl;
if (num1 == num2)
cout << 0 << endl;
else
{
int flag1 = 1, flag2 = 1;
for (int i = 1; i < n; ++i)
{
if (__gcd(a[i - 1], a[i]) % num1==0)
{
flag1 = 0;
break;
}
}
for (int i = 1; i < n; ++i)
{
if (__gcd(a[i - 1], a[i]) % num2==0)
{
flag2 = 0;
break;
}
}
if (flag1 + flag2 == 0)
cout << 0 << endl;
else if (flag1)
cout << num1 << endl;
else
cout << num2 << endl;
}
}
return 0;
}
D
肯定要大数做分母,但是分子由谁来做?
这里想一想最后需要把所有剩下的数字加起来所以尽可能地要使用大数
- 贪心的想法就出来了,优先用k个大数做分母
- 紧接着k个数做分子就都是零了,
- 把剩下的加上输出
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
ll t, n, k;
int main()
{
cin >> t;
while (t--)
{
cin >> n >> k;
vector<ll> a(n);
for (auto &i : a)
cin >> i;
ll sum = 0;
int i, j, l;
sort(a.begin(), a.end());
reverse(a.begin(), a.end());
for (int i = 0, l = 1; l <= k; ++l, ++i)
{
sum += a[i + k] / a[i];
}
for (int i = 2*k; i < n; ++i)
{
sum += a[i];
}
cout << sum << endl;
}
return 0;
}
E
矩阵写出来有规律:
- 这个角度看所有列加起来除以 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)得到的就是 ∑ a i \sum{a_i} ∑ai的值记为 s s ss ss
- 例子:将第一列减去 ∑ a i \sum{a_i} ∑ai得到的就是正好比第n列多一项 n a 1 na_1 na1
- 根据例子得到 a i = b [ ( i + n − 1 ) % n ] + s s − b [ ( i + n ) % n ] n a_i=\frac{b[(i+n-1)\%n]+ss-b[(i+n)\%n]}{n} ai=nb[(i+n−1)%n]+ss−b[(i+n)%n]
题目就是这样但是有几点注意
- 记得
long long
- 记得判断 s s ss ss是否为整数
- 记得判断求得的 a i a_i ai是否为整数
- 判断 a i a_i ai是否越界
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
ll t, n, k;
int main()
{
cin >> t;
while (t--)
{
cin >> n;
vector<ll> a(n);
for (auto &i : a)
cin >> i;
ll sum = 0;
for (auto i : a)
sum += i;
ll ss = sum * (ll)2 / (n * (n + 1));
if (sum * (ll)2 % (n * (n + 1)))
{
cout << "NO\n";
continue;
}
// cout << ss << endl;
vector<ll> b(n);
bool flag = 1;
for (int i = 0; i < n; i++)
{
ll x = (a[(i + n - 1) % n] - a[(i + n) % n] + ss) % n;
if (x || (a[(i + n - 1) % n] - a[(i + n) % n] + ss) / n <= 0 || (a[(i + n - 1) % n] - a[(i + n) % n] + ss) / n > 1e9)
{
flag = 0;
break;
}
else
{
b[i] = (a[(i + n - 1) % n] - a[(i + n) % n] + ss) / n;
}
}
if (flag)
{
cout << "YES\n";
for (auto i : b)
cout << i << ' ';
cout << endl;
}
else
cout << "NO\n";
}
return 0;
}