放球游戏(51nod 1418)模拟
2016-05-25 21:47
267 查看
模拟,每次从左到右找第一个最优插入点,更新新的字符串,当本字符串已经能够得到最优值6,那么之后不用在模拟了,直接计算输出即可。
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> using namespace std; char a[55]; int judge(char& a){ //判断哪种颜色 if(a=='R') return 0; else if(a=='B') return 1; else if(a=='G') return 2; } int main(){ int T; scanf("%d",&T); getchar(); while(T--){ scanf("%s",a); int n = strlen(a); char t[55]; int l = 0; int ans = 0; for(int i=0;i<n;i++){ int d = 0; //最后插入的位置 int sum = 0; //本次最优的值 int left = 0; //左边的值 int right = 0; //右边的值 for(int j = 0;j<l;j++){ //对每一个位置枚举 left = right = 0; //每次初始化 char s[3]; //每个位计数 memset(s,0,sizeof(s)); for(int x = 0;x<j;x++){ //计算左边的颜色种数 if(s[judge(t[x])]==0){ s[judge(t[x])]=1; left++; } if(left==3) break; //当已经为三种,最大值了,则不需要再判断 } memset(s,0,sizeof(s)); for(int x = j;x<l;x++){ //计算右边的颜色种数 if(s[judge(t[x])]==0){ s[judge(t[x])]=1; right++; } if(right==3) break; } if(sum<left+right){ //若当前点插入最优,则更换 sum = left+right; d = j; } } if(sum == 6){ //当本次左右的值都为最大值,则之后在本位置插入都会为最大值,无需在模拟 ans += (n-i)*6; break; } else{ ans += sum; } for(int k=l;k>=d&&k-1>=0;k--){ //更新当前序列 t[k] = t[k-1]; } t[d] = a[i]; l++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- MySQL各种存储引擎的对比
- source insight 添加 python 支持
- C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)
- javaSE 模拟Spring框架的Ioc
- 多重背包(动态规划)
- zxing私人定制之一 初试扫码
- malloc与free函数用法
- CodeForces 590A
- Git and GitHub
- HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
- Java系统工具jps原理解析
- Flume-ng的原理和使用
- poj 1845 Sumdiv
- 2016/05/25 get和post的区别
- python简单操作excel
- 6.python 相对导入
- N层交换
- linux基本命令(35)——ln命令
- 23种设计模式(11):责任连模式
- mysql 发现系统错误 2报错找不到服务文件 和修改密码