http://cxsjsxmooc.openjudge.cn/2018t2winterw1/001/
这道题不难,可以枚举来写,每个锁两种状态一共30个锁2^30的复杂度可能不会超,在此提供另外一种贪心的思路。
对于第一个锁,我们枚举(好吧算不上枚举)开或不开两种情况。如果第一个锁不为目标状态,那么只有第二个锁才能关掉它。。。依次类推,如果第i个锁不为目标状态,那么只有第i+1个锁才能关掉它
最后,我们只用判断最后一个锁是否为目标状态即可
#include
#include
#include
#include
using namespace std;
const int maxn = 35;
int srcCode[maxn], desCode[maxn];
int len = 1;
int solve(int i1)
{ //第一个按钮按或不按时的最优解,无解返回1<<30
int step = 0, tmp[maxn];
if(i1) step++;
for(int i = 1;
i <= len;
i++)
tmp[i] = srcCode[i];
tmp[1] ^= i1;
tmp[2] ^= i1;
//按或不按第一个按钮
for(int i = 1;
i < len;
i++)
if(tmp[i] != desCode[i]){ //如果第i个按钮不为目标状态,按下第i+1个按钮
tmp[i] ^= 1, tmp[i+1] ^= 1, tmp[i+2] ^= 1;
step++;
}if(tmp[len] == desCode[len]) return step;
//符合情况
else return 1<<30;
//不符合情况
}int main()
{
char input[maxn];
memset(input, 0, sizeof(input));
gets(input);
for(len = 0;
input[len]!=0;
len++)
srcCode[len+1] = input[len]-'0';
gets(input);
for(len = 0;
input[len]!=0;
len++)
desCode[len+1] = input[len]-'0';
int ans = min(solve(1), solve(0));
//取第一个按钮按或不按的最优解即可
if(ans < 1<<30) printf("%d\n",ans);
else printf("impossible\n");
return 0;
}
【贪心|001:特殊密码锁(贪心)】
推荐阅读
- c语言|【C语言】自定义类型 结构体 枚举 联合
- 题库-CF|【Codeforces Round 263 (Div 2)C】【贪心 哈弗曼思维】Appleman and Toastman 每个非1size子树延展为2子树的最大权
- Codeforces|Codeforces Round #643 (Div. 2) B.Young Explorers
- ZOJ-3447---Doraemon's Number Game (贪心+大数)
- CodeForces 567A Lineland Mail 贪心
- codeforces|Codeforces Round #643 (Div. 2) D. Game With Array (思维,贪心)
- Codeforces Round #643 (Div. 2) B. Young Explorers 题解(贪心)
- CodeForces - 1060D E - Social Circles
- Codeforces Round #503 (by SIS, Div. 2) C. Elections(贪心)