Codeforces Round #824 (Div. 2)
A. Working Week
题目大意
在 n 天工作日中我们可以安排3天休息日,但是两两休息日不可相邻,且最后一天一定是休息日,第一天不可以是休息日,问在n天的工作周期中,三个工作段 l1 l2 l3
min(|l1−l2|,|l2−l3|,|l3−l1|)min(|l1−l2|,|l2−l3|,|l3−l1|).
的最大值
题目分析
工作日一共n-3
天,我们将这些天数分配即可,平均一段 w = (n-3)/3
天。若将三个工作段看作从小到大的顺序的话,我们可将第一段认为是1
天,第二段为w
天,第三段为2w-1
天,即刻的最大差值为w-1
code
#include<bits/stdc++.h>
using namespace std;
int n, m, k, t;
void solve()
{
cin >> n;
int res = (n - 3) / 3;
cout << res - 1 << "\n";
}
int main()
{
cin >> t;
while(t --) solve();
return 0;
}
B. Tea with Tangerines
题目大意
有 n 块陈皮,我们可以把每一块陈皮分成两部分。对于陈皮中的任意两块x, y
,我们要保证不能出现y >= zx
的情况。为最少进行分块的次数是多少。
题目分析
初始时每块陈皮的尺寸是按照从小到大给出的,所以对于最小的数u
要满足2u > y
。则对于其他的陈皮来说应<= 2u - 1
,累加操作次数即可
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
typedef long long ll;
int n, m, k, t;
ll a[N];
void solve()
{
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i];
ll ans = 0;
for(int i = 0; i < n;i ++)
ans += (a[i] - 1) / (2 * a[0] - 1);
cout << ans << "\n";
}
int main()
{
cin >> t;
while(t --) solve();
return 0;
}