51NOD 1282 时钟
来源:互联网 发布:python webdriver 编辑:程序博客网 时间:2024/06/05 22:49
1282 时钟
题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
有N个时钟,每个时钟有M个指针,P个刻度。时钟是圆形的,P个刻度均分整个圆。每个时钟每个指针指向整数刻度,并且每个时钟自身指针指向的数字都不同。你可以任意旋转时钟的表盘,但是你不能转指针。问最后有多少对时钟可以变成相同的状态。
例如:N = 5,M = 2,P = 4,5个时钟的数据如下{1, 2} {2, 4} {4, 3} {2, 3} {1, 3}
经过旋转后。 其中(1, 3), (1, 4), (2, 5) 和 (3, 4)是相同的。
给出所有时钟的数据,求有多少对时钟是相同的。
Input
第1行:3个数N, M, P中间用空格分隔,其中N为时钟的数量,M为表针的数量,P为刻度的数量(1 <= M, N <= 500, 1 <= P <= 10^9, M <= P)。第2 - N + 1行:每行M个数,对应一个时钟,M个指针的位置。
Output
输出有多少对时钟是相同的。
Input示例
5 2 41 22 44 32 31 3
Output示例
4
李陶冶 (题目提供者)
STL土法大炼钢一下就好了...一个指针序列 可以转化为 一个长度为M的,相邻2个指针间差值的序列
问题就是求这样的序列相同的数量
循环数组,找出字典序最小的差值序列,放map里即可
#include <bits/stdc++.h>#define ll long long#define pii pair<int,int>#define MEM(a,x) memset(a,x,sizeof(a))using namespace std;const int inf=1e9+7;const int N = 500+5;int a[N];map<deque<int>,int>mp;void add(int*a,int m,int p){ sort(a,a+m); int a0=a[0]; for(int i=0;i<m-1;++i){ a[i]=a[i+1]-a[i]; } a[m-1]=p+a0-a[m-1]; deque<int>tmp,ans; tmp.assign(a,a+m); ans.assign(a,a+m); for(int i=0;i<m;++i){ tmp.push_back(a[i]); tmp.pop_front(); ans=min(ans,tmp); } mp[ans]+=1;;}int slove(){ int ans=0; for(auto&it:mp){ int x=it.second; ans+=(x-1)*x/2; } return ans;}int main(){ //freopen("/home/lu/code/r.txt","r",stdin); int n,m,p; while(~scanf("%d%d%d",&n,&m,&p)){ mp.clear(); for(int i=0;i<n;++i){ for(int j=0;j<m;++j){ scanf("%d",&a[j]); } add(a,m,p); } printf("%d\n",slove()); } return 0;}
阅读全文
0 0
- 51nod 1282 时钟
- 51NOD 1282 时钟
- 51Nod-1282-时钟
- 51nod 1282 时钟(哈希+最小表示法)
- 51nod 1282 时钟 哈希+最小表示法+map
- 51Nod 1282 时钟 —— 最小表示法 + 字符串哈希
- 1282 时钟
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- axure使用总结
- sturts2拦截器
- 循环冗余校验码
- Android 7.0 新功能一览
- Kotlin学习之路(1)--环境篇
- 51NOD 1282 时钟
- 把字符串转换成整数
- react-native播放视频组件 react-native-video的用法
- Unity3d开发中的特殊文件夹
- Mac 下 GitHub 的使用
- House Robber
- 7种形式的Android Dialog使用举例
- iptables
- C#中@的用法总结