【题】【前缀和】NKOJ3469 比赛

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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值