Problem F. Finance
题目连接:
http://codeforces.com/gym/100714
Description
The Big Boss Company (BBC) principal is going to prepare a vacation schedule for the next year. Each
employee of BBC gets a four-week vacation each year. A vacation can be divided into several parts. Each
part consists of several weeks. The parts are separated by at least one work week.
According to the law, the pay for each vacation part is calculated separately from the others as follows.
Consider the employee’s salary for the period of 52 weeks preceding the current part of the vacation and
divide it by 52. (A year is assumed to consist of exactly 52 weeks.) All vacation pays during these 52
weeks are ignored for the purpose of salary calculation. The result is multiplied by the number of weeks
in this part of the vacation (ranging from 1 to 4).
Given the vacation schedules for the current year, you should help the BBC principal to construct the
next year’s schedule that minimizes the total vacation pay costs. Since the pays for distinct employees
are unrelated you are to solve the problem assuming that there is only one employee.
Input
The input contains four integers listed in the ascending order giving the vacation weeks in the current
year’s schedule. Weeks are specified by numbers ranging from 1 to 52.
Output
Output the numbers of vacation weeks for the next year in the ascending order. The vacation schedule
should minimize the vacation pay costs. If there are several equivalent solutions, output any of them.
Sample Input
2 3 20 21
Sample Output
1 2 3 5
Hint
题意
给你去年的假期安排,然后让你安排今年的假期,使得花费最少。
假期的花费是这样的,如果前面52天有一个假期的话,那么这一天的花费–
但是连着一起的话,就跟着算。
(我语文不好。。 还是自己读题吧 TAT
题解:
52^4枚举,然后再check就好了,check我用的树状数组,仔细一想,好像直接O(56)枚举,然后判断就好了……
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
int ans,ans1,ans2,ans3,ans4;
int ppp[maxn];
int lowbit(int x){
return x&(-x);
}
void update(int x,int v){
for(int i=x;i<maxn;i+=lowbit(i))
ppp[i]+=v;
}
int get(int x,int tmp=0){
if(x==0)return 0;
for(int i=x;i;i-=lowbit(i))
tmp+=ppp[i];
return tmp;
}
void cal(int x,int y,int z,int t){
int px=x,py=y,pz=z,pt=t;
if(y==x+1)y=x;
if(z==x+2)z=x;
if(z==y+1)z=y;
if(t==x+3)t=x;
if(t==y+2)t=y;
if(t==z+1)t=z;
update(px+52,1);
update(py+52,1);
update(pz+52,1);
update(pt+52,1);
int a1=get(x+51)-get(x-1);
int a2=get(y+51)-get(y-1);
int a3=get(z+51)-get(z-1);
int a4=get(t+51)-get(t-1);
int d[5];
d[1]=0,d[2]=0,d[3]=0,d[4]=0;
d[a1]++;
d[a2]++;
d[a3]++;
d[a4]++;
int sum = (52-a1)+(52-a2)+(52-a3)+(52-a4);
if(sum<ans){
ans=sum,ans1=px,ans2=py,ans3=pz,ans4=pt;
}
update(px+52,-1);
update(py+52,-1);
update(pz+52,-1);
update(pt+52,-1);
}
int main(){
//freopen("1.out","w",stdout);
int a,b,c,dd;
ans = 1e9;
scanf("%d%d%d%d",&a,&b,&c,&dd);
update(a,1);
update(b,1);
update(c,1);
update(dd,1);
cal(1,2,3,4);
for(int i=1;i<=52;i++){
for(int j=i+1;j<=52;j++){
for(int k=j+1;k<=52;k++){
for(int t=k+1;t<=52;t++){
cal(i,j,k,t);
}
}
}
}
cout<<ans1<<" "<<ans2<<" "<<ans3<<" "<<ans4<<endl;
}