NKOJ3469 比赛
时间限制 : 10000 MS 空间限制 : 165536 KB
问题描述
有三个小伙伴组队去参加 ACM 比赛,这场比赛共有n道题目,他们的比赛策略是这样的:每个队员都会对题目通看一遍,然后对每个题的难度进行估算,难度范围为 1~9。当然,由于每个队员的水平和特点, 他们对同一道题的估算不一定相同。
接下来他们会对所有题目进行分配。三个人分配的题目刚好是所有题目,且不会有交集,而且每个人分配的题目的编号必须是连续的,每人至少要 分一道题。请问,如何分配题目可以使得三个人拿到的题目的难度之和最小。每个人对自己 分配到的题目只按自己的估算值求和。
输入格式
第一行一个数 n,表示题目的数量。
接下来有 3 行,每行表示一个学生,每行有 n 个数,表示该生对n道题的估算难度,难度介于 1~9。
输出格式
一个整数。表示最小的估算难度之和
样例输入
样例1:
3
1 3 3
1 1 1
1 2 3
样例2:
5
4 1 5 2 4
3 5 5 1 1
4 1 4 3 1
样例输出
样例1:
4
样例2:
11
提示
样例1解释:第一个同学选第1题,第二个同学选第3题,第三个同学选第2题
样例2解释:第一个同学选第3题,第二个同学选第4,5题,第三个同学选第1,2题
数据范围:
对于 20% 的数据:3 <= N <= 1000
对于 100% 的数据:3 <= N <= 200000
#include<cstdio>
#include<iostream>
using namespace std;
const int need=200004;
int sum[3][need];
int p[7][3]={{0},{1,2,0},{1,0,2},{2,1,0},{2,0,1},{0,1,2},{0,2,1}};
//....................................................................
inline int in_()
{
char t=getchar();
while(t<'0'||t>'9') t=getchar();
return t-'0';
}
//....................................................................
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
int n;scanf("%d",&n);
for(int i=0,j,a;i<3;i++)
for(j=1;j<=n;j++)
sum[i][j]=sum[i][j-1]+in_();
int ans=1e9;
for(int k=1,i,nn,mini,sj,tot;k<=6;k++)
{
for(tot=mini=sj=1e9,i=1,nn=n-2;i<=nn;i++)
{
mini=min(mini,sum[p[k][0]][i]-sum[p[k][1]][i]);
sj=sum[p[k][1]][i+1]-sum[p[k][2]][i+1];
tot=min(mini+sj,tot);
}
ans=min(ans,tot+sum[p[k][2]][n]);
}
printf("%d",ans);
}