CF Gym 100637A Nano alarm-clocks

题意:给你一些钟的时间,只可以往后调, 问最少调的时间总和是多少

题解:因为肯定是调到某个出现过时间的,只要枚举时间,在维护一个前缀和快速计算出时间总和就行了。

#include<cstdio>

#include<cmath>

#include<vector>

#include<map>

#include<set>

#include<algorithm>

#define first fi

#define second se

using namespace std;

typedef long long ll;



const int maxn = 100005;

const int hmod = 12;

const ll mmod = 1e6;

const ll Fac = 1e12;

const ll tmod = 12e12;//ll







ll sum[maxn];

ll times[maxn];

int main()

{

    int n;

    scanf("%d",&n);



    for(int i = 1; i <= n; i++){

        int th,tm,ts;

        scanf("%d%d%d",&th,&tm,&ts);

        times[i] = th*Fac+tm*mmod+ts;

    }

    sort(times+1,times+1+n);

    for(int i = 1; i <= n; i++)

        sum[i] = sum[i-1]+times[i];

    ll ans = 0x7fffffffffffffffll;

    for(int i = 1; i <= n; i++){

        ll tmp = i*times[i] - sum[i];   //前面的钟拨到time(i)

        tmp += (tmod+times[i])*(n-i)-sum[n]+sum[i];//后面的钟拨到time(i)

        ans = min(ans,tmp);

    }



    int ansH,ansM,ansS;

    ansH = ans/Fac; ans -= ansH*Fac;

    ansM = (ans/mmod); ans -= ansM*mmod;

    ansS = ans;

    printf("%d %d %d",ansH,ansM,ansS);

    return 0;

}

 

你可能感兴趣的:(Lock)