Codeforces Round 824 (Div. 2
A. Working Week
题意
一人工作n天,有三天的休息时间,最后一天一定是休息日,第一天不能为休息日,找出另外两天休息日,找出每段间隔相减的绝对值的最小值
除了休息三天外,一共要工作n-3天,则设工作最后一天为x,第一天为1,则中间值为(x+1)/2,故对于x有1+(x+1)/2+x=n-3,且| l1 - l2 |,| l2- l3 | ,| l3 - l1 |的值可求,从而求出最小值。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
while(n--)
{
int a;cin>>a;
int x,b,c;
x=(2*a-9)/3;
b=fabs((1+x)/2-1);
c=min(x-1,b);
c=min(c,(x-1)/2);
cout<<c<<endl;
}
return 0;
}
此题也可通过二分法编写
B. Tea with Tangerines
题意:
对于一个数ai,在一个步骤中,可以将一个大小为x的块分成两个大小为y和z的正整数块,这样y+z=x,并且2*x>y(x>=y)。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)//
{
int n;cin>>n;vector<int>v;int a;
for(int i=0;i<n;i++)
{
cin>>a;v.push_back(a);//读入数组
}
sort(v.begin(),v.end());//排序找最小值,最小值不动,去切割其他数,每次都切割最小的数v[0]*2-1
int c=0;
for(int i=1;i<n;i++)
{
c+=v[i]/(v[0]*2-1);///每个数ai的步骤为ai/(最小值*2-1)
if(v[i]%(v[0]*2-1)==0)//如果v[i]为(最小值*2-1)的倍数,次数就需减-1
c-=1;
}
cout<<c<<endl;
}
return 0;
}