Gym - 100637A Nano alarm-clocks 模拟

题意:有n个时钟,只能顺时针拨,问使所有时间相同的最小代价是多少

思路:将时间排序,枚举拨动到每一个点的时间就好了,容易证明最终时间一定是其中之一

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <fstream>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <deque>
 7 #include <vector>
 8 #include <queue>
 9 #include <string>
10 #include <cstring>
11 #include <map>
12 #include <stack>
13 #include <set>
14 #define LL long long
15 #define eps 1e-8
16 #define INF 0x3f3f3f3f
17 #define MAXN 200005
18 #define U 1000000
19 using namespace std;
20 LL t[MAXN], sum1[MAXN], sum2[MAXN];
21 int main()
22 {
23 #ifndef ONLINE_JUDGE
24     freopen("in.txt", "r", stdin);
25     //freopen("out.txt", "w", stdout);
26 #endif // OPEN_FILE
27     int n;
28     memset(t, 0, sizeof(t));
29     memset(sum1, 0, sizeof(sum1));
30     memset(sum2, 0, sizeof(sum2));
31     LL x, y, z;
32     scanf("%d", &n);
33     for(int i = 1; i <= n; i++){
34         scanf("%I64d%I64d%I64d", &x, &y, &z);
35         t[i] = (x * U + y) * U + z;
36     }
37     sort(t + 1, t + n + 1);
38     for(int i = 1; i <= n; i++){
39         sum1[i] = sum1[i - 1] + t[i];
40     }
41     for(int i = n; i >= 1; i--){
42         sum2[i] = sum2[i + 1] + t[i];
43     }
44     LL ans;
45     bool flag = false;
46     LL ALL = 1000000LL * 1000000LL * 12LL;
47     for(int i = 1; i <= n; i++){
48         LL res = (i - 1) * t[i] - sum1[i - 1] + ALL * (n - i) - (sum2[i + 1] - (n - i) * t[i]);
49         if(!flag){
50             ans = res;
51             flag = true;
52         }
53         else{
54             ans = min(ans, res);
55         }
56     }
57     LL s = ans % U;
58     ans = ans / U;
59     LL m = ans % U;
60     ans = ans / U;
61     LL h = ans;
62     printf("%I64d %I64d %I64d\n", h, m, s);
63 }
时间: 2024-10-07 07:46:00

Gym - 100637A Nano alarm-clocks 模拟的相关文章

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

Codeforces Gym 100637A A. Nano alarm-clocks 前缀和处理

A. Nano alarm-clocks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100637/problem/A Description An old watchmaker has n stopped nano alarm-clocks numbered with integers from 1 to n. Nano alarm-clocks count time in hours, and

Codeforces Gym 100637A A. Nano alarm-clocks 前缀和

A. Nano alarm-clocks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100637/problem/A Description An old watchmaker has n stopped nano alarm-clocks numbered with integers from 1 to n. Nano alarm-clocks count time in hours, and

Gym 100633G Nano alarm-clocks

题目,给定n个时钟,要求把他们调成一样的时间.求最小的步数 思路:肯定是有一个时钟作为标准的啦,要找到这个时钟,怎么找呢?没其他方便的方法,暴力枚举.那么枚举后,怎么能快速地算到其他时钟转到这个时钟的时间呢?首先,如果我们把时间转换成数字,那应该好做点.现在问题是给定n个数,枚举最小的步数,使得n个数字相同. 例如我们把时间变为1.3.5.7.9这样的.(输出的时候按照权值变化成时间就可以了) 现在枚举5,预处理一个前缀和sum[i],那么在5前面的数字一共变化步可以快速算出来.i*a[i]-s

Gym - 100203G Good elements 水+模拟

题意:good element的定义是a[i]在1~i-1中任取三个数(可以重复)的和能等于a[i] 思路:vis[x]标记一下任两个数的和,处理a[i]时枚举1~i-1判断vis[a[i] - a[j]]是否被标记 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <cmath> 6 #include

Educational Codeforces Round 81 (Rated for Div. 2) A Display The Number

A. Display The Number time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You have a large electronic screen which can display up to 998244353998244353 decimal digits. The digits are displayed

【模拟】NEERC15 G Generators(2015-2016 ACM-ICPC)(Codeforces GYM 100851)

题目链接: http://codeforces.com/gym/100851 题目大意: n个序列.每个序列有4个值x,a,b,c,之后按照x=(a*x+b)%c扩展无穷项. 求每个序列各取一个数之后求和不是K的倍数的最大值. (x,a,b,c<=1000,n<=10000,K<=109) 题目思路: [模拟] 先暴力把每个序列能够获得的值都求出来.存下最大的两个%K不相等的值. 接下来先取每个序列最大的值,如果%K不为0则为答案. 否则把其中一个换成次优值.因为前面满足%K不相等所以只

【模拟】ECNA 2015 I What&#39;s on the Grille? (Codeforces GYM 100825)

题目链接: http://codeforces.com/gym/100825 题目大意: 栅栏密码.给定N(N<=10),密钥为一个N*N的矩阵,'.'代表空格可以看到,'X'代表被遮挡,还有密文字符串S,长度为N*N 每次将这个矩阵顺时针旋转90°,把矩阵中空格对应的位置按照从上到下从左到右的顺序依次填充上密文字符,求最终这个密文字符能否填满N*N的矩阵,能按顺序输出得到的答案,不能输出"invalid grille" 题目思路: [模拟] 直接模拟即可.旋转的坐标公式很好推.

【模拟】NEERC15 E Easy Problemset (2015-2016 ACM-ICPC)(Codeforces GYM 100851)

题目链接: http://codeforces.com/gym/100851 题目大意: N个人,每个人有pi个物品,每个物品价值为0~49.每次从1~n顺序选当前这个人的物品,如果这个物品的价值>=之前所有物品价值和则加上这个物品,否则这个物品舍弃不计算在内. 总共拿出K个物品,如果一个人没物品拿了那么他会拿出价值为50的物品.求最终物品价值和有多少. 题目思路: [模拟] 直接暴力枚举.判断是否超过之前的总和,如果有人拿了50则后面的人肯定都是拿50. 1 // 2 //by coolxxx