标签:
题意:给你一些钟的时间,只可以往后调, 问最少调的时间总和是多少
题解:因为肯定是调到某个出现过时间的,只要枚举时间,在维护一个前缀和快速计算出时间总和就行了。
#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; }
CF Gym 100637A Nano alarm-clocks
标签:
原文地址:http://www.cnblogs.com/jerryRey/p/4675986.html