LA3401
2016-05-30 22:25
232 查看
Problem: Colored Cubes
Description: 给你一下涂了色的正方体。现在问你能不能通过重涂某些正方体的某些面使得所有的正方体涂色都是一样的。
Solution: 看到这个题目,可以肯定这是一个模拟题。我们要怎么模拟呢,题目中会给出每个正方体在标准摆放方位的颜色,但是正方体是可以旋转的,也就是每转动一个方位,对应的颜色排列就是不一样的。于是我们可以通过计算得出一个正方体的颜色排列有4∗2∗3=24种情况。于是我们要枚举每个正方体的排列,但是注意,第一个正方体不用枚举,把它作为一个基准。然后在每种枚举中,我们要对每个正方体的6个面进行修改涂色,我们肯定要选出一个颜色作为涂色标准,那么我们再次枚举面的颜色,看涂哪个颜色会使重涂的面最小。这样一轮轮枚举下来,终于过了这个题。但是也遇到了一个小问题。一开始TLE了,后来才发现我一开始没有把颜色映射成数字,导致在比较两个字符串的时候又多了一重循环。所以超时了,改了后就AC了。还有,下面这个
Code(C++):
后来我又想着,如果在
Description: 给你一下涂了色的正方体。现在问你能不能通过重涂某些正方体的某些面使得所有的正方体涂色都是一样的。
Solution: 看到这个题目,可以肯定这是一个模拟题。我们要怎么模拟呢,题目中会给出每个正方体在标准摆放方位的颜色,但是正方体是可以旋转的,也就是每转动一个方位,对应的颜色排列就是不一样的。于是我们可以通过计算得出一个正方体的颜色排列有4∗2∗3=24种情况。于是我们要枚举每个正方体的排列,但是注意,第一个正方体不用枚举,把它作为一个基准。然后在每种枚举中,我们要对每个正方体的6个面进行修改涂色,我们肯定要选出一个颜色作为涂色标准,那么我们再次枚举面的颜色,看涂哪个颜色会使重涂的面最小。这样一轮轮枚举下来,终于过了这个题。但是也遇到了一个小问题。一开始TLE了,后来才发现我一开始没有把颜色映射成数字,导致在比较两个字符串的时候又多了一重循环。所以超时了,改了后就AC了。还有,下面这个
hash_array我可是拿着一个烟盒标上数字不断旋转来得到的。
Code(C++):
#include <iostream> #include <string> #include <algorithm> #include <vector> #define MIN(a,b) ((a)>(b)? (b):(a)) using namespace std; const int E=6; const int M=24; const int H=4; const int INF=0x3f3f3f3f; const int hash_array[M][E]={ {0,1,2,3,4,5},{1,5,2,3,0,4},{5,4,2,3,1,0},{4,0,2,3,5,1}, {0,4,3,2,1,5},{4,5,3,2,0,1},{5,1,3,2,4,0},{1,0,3,2,5,4}, {3,0,4,1,5,2},{0,2,4,1,3,5},{2,5,4,1,0,3},{5,3,4,1,2,0}, {3,5,1,4,0,2},{5,2,1,4,3,0},{2,0,1,4,5,3},{0,3,1,4,2,5}, {3,1,0,5,4,2},{1,2,0,5,3,4},{2,4,0,5,1,3},{4,3,0,5,2,1}, {4,2,5,0,3,1},{2,1,5,0,4,3},{1,3,5,0,2,4},{3,4,5,0,1,2} }; int n; int cube[H][E]; int index[H]; int Ans; vector<string> color; int get_int(string s) { int len=color.size(); for(int i=0;i<len;i++) if(color.at(i)==s) return i; color.push_back(s); return len; } int judge() { int ans=0; for(int i=0;i<E;i++){ int SUM=INF; for(int k=0;k<n;k++){ int sum=0; for(int j=0;j<n;j++) if(k!=j&&cube[k][hash_array[index[k]][i]]!=cube[j][hash_array[index[j]][i]]) ++sum; SUM=MIN(SUM,sum); } ans+=SUM; } return ans; } void dfs(int k,int x) { if(x==n){ int sum=judge(); Ans=MIN(Ans,sum); return ; } index[x]=k; for(int i=0;i<M;i++) dfs(i,x+1); } int work() { Ans=INF; dfs(0,0); return Ans; } int main() { while(cin>>n,n){ string str; for(int i=0;i<n;i++) for(int j=0;j<E;j++) cin>>str, cube[i][j]=get_int(str); if(n==1){ cout<<"0"<<endl; continue; } int ans=work(); cout<<ans<<endl; } return 0; }
后来我又想着,如果在
judge这个函数中能减少一重循环,那么时间可以缩短一半以上。但是,不知道怎么回事,老是RE,我找不出BUG了。
int judge() { int ans=0; for(int i=0;i<E;i++){ int SUM=0; int cnt[M]; for(int j=0;j<M;j++) cnt[j]=0; for(int k=0;k<n;k++) ++cnt[cube[k][hash_array[index[k]][i]]]; for(int k=0;k<M;k++) SUM=MAX(SUM,cnt[k]); ans+=n-SUM; } return ans; }
相关文章推荐
- Httpclient4.5
- redis全量复制和部分复制简介
- 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
- 设计模式学习笔记--单例模式
- iOS 多线程篇11—自定义NSOperation
- tiny_cnn源码阅读(3)-layer_base和layer
- 动态生成多级菜单
- 个人工作总结07(冲刺二)
- php发送get、post请求的几种方法
- 数据库调优
- C++ 数据类型、运算符、和表达式 入门基础知识和概念(二)
- c++编写简易mips编译器
- eclipse配置maven -centos系统
- IOC 依赖注入 Unity
- 一些小问题
- hibernate整合spring的配置原理
- 5行lua代码在redis上做发号器
- Java发送邮件服务
- 第21章:用于不相交集合的数据结构
- Android压缩图片到100K以下并保持不失真的高效方法