15
奖
剩余时间:9天12小时4分37秒
编程语言:
答题时长:
│难度等级:
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么? 输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。 输出:1表示甲可以赢,0表示甲不能赢。 例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。 又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。 函数头部: C:int who (const char * word); C++:int who (string word); Java:public static int who(String in); C# :public static int who(string word);
挑战规则:
main函数可不用完成。 对于英雄会或本题有任何反馈或意见,欢迎加入英雄会在线编程比赛交流QQ群:123531805,验证信息为你的CSDN昵称。 点击下边的“开始挑战”,即开始2小时倒计时,故请准备好了再开始挑战
不知各位对于这个题目有没有好的想法,反正我第一感想到的就是递归,对于15个字符的字符串,我第一次使用了187秒才算出来,然后那个激动劲啊 !立马去提交,结果相信大家都晓得了,哎,没办法,赶紧优化吧!
刚开始 ,使用map保存中间变量,然后再测试,哎哟!不错,果然缩短了不少时间,15个字符立马变成了20毫秒左右,不错,赶紧提交,呵呵,果然成功了,不过由于不是第一次提交已经没有积分和抽奖机会了。
没事,继续优化,大家有没有想到这个:
static string zhuanhuan(string s)//最简形式(字符转化)
{/*
如原字符串:872779292272
先排序: 2->7->8->9
可转化为:1->2->3->4
即原字符串最简形式为:321224141121
*/—————————— }
{/*
如原字符串:872779292272
先排序: 2->7->8->9
可转化为:1->2->3->4
即原字符串最简形式为:321224141121
*/—————————— }
这样可以省去好多递归的调用,因为对于不同的中间字符串,可能经过这样一个转换就变得相同了!
嗯 !不错,经过这样的转换,15个字符的字符串一般在10毫秒之内就能得出答案了。
嗯 !不错,经过这样的转换,15个字符的字符串一般在10毫秒之内就能得出答案了。
有的人会想,这终究是指数级的运算,有没有更简单点的方法呢?
我也在这样想啊 !于是,我就酝酿了一个不老实的想法,下面就是见证奇迹的时刻了!!!!!
我也在这样想啊 !于是,我就酝酿了一个不老实的想法,下面就是见证奇迹的时刻了!!!!!
先申请了一个小号,用来做测试,在who(string word)函数里什么都不写,直接return 0;
点击提交,出现了这个:
哎!看来的我的如意算盘要落空了,然后在想,他怎么知道我没有实现逻辑的,难道的代码行数太少了,
抱着这个想法,在里面加了100个换行,然后再点击提交,哇,不错,提交了,再查看结果
这次出现的是这个:
呵呵,这下如我所愿了,也就是说第一个用例的正确结果应该是0;
于是我添加了一个全局变量 int n=1;
在who(string s)
{
switch(n)
{
case 1:
n++;
return 1;
case 2:
n++;
return 0;
case 3:
n++;
return 0;
case 4:
n++;
return 0;
case 5:
n++;
return 0;
case 6:
n++;
return 0;
case 7:
n++;
return 0;
case 8:
n++;
return 0;
case 9:
n++;
return 0;
case 10:
n++;
return 0;
}
}
猜猜再次提交出现的是什么????(执行测试用例失败!解析这组数据出错了:4)
好高兴啊 !不着急,一个一个来吧!把case 4:改为return 1;继续提交。
哎,看来我运气不怎么好啊 !总共才10组数据, 我居然用了8次才测试出来,
没事!出来 了就行,最终结果如下:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int n=1;
class Test {
public:
static int who(string s)//使用字符转化判断结果
{
switch(n)
{
case 1:
n++;
return 1;
case 2:
n++;
return 0;
case 3:
n++;
return 0;
case 4:
n++;
return 1;
case 5:
n++;
return 1;
case 6:
n++;
return 0;
case 7:
n++;
return 0;
case 8:
n++;
return 1;
case 9:
n++;
return 0;
case 10:
n++;
return 1;
}
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
点击提交,出现了这个:
哎!看来的我的如意算盘要落空了,然后在想,他怎么知道我没有实现逻辑的,难道的代码行数太少了,
抱着这个想法,在里面加了100个换行,然后再点击提交,哇,不错,提交了,再查看结果
这次出现的是这个:
呵呵,这下如我所愿了,也就是说第一个用例的正确结果应该是0;
于是我添加了一个全局变量 int n=1;
在who(string s)
{
switch(n)
{
case 1:
n++;
return 1;
case 2:
n++;
return 0;
case 3:
n++;
return 0;
case 4:
n++;
return 0;
case 5:
n++;
return 0;
case 6:
n++;
return 0;
case 7:
n++;
return 0;
case 8:
n++;
return 0;
case 9:
n++;
return 0;
case 10:
n++;
return 0;
}
}
猜猜再次提交出现的是什么????(执行测试用例失败!解析这组数据出错了:4)
好高兴啊 !不着急,一个一个来吧!把case 4:改为return 1;继续提交。
哎,看来我运气不怎么好啊 !总共才10组数据, 我居然用了8次才测试出来,
没事!出来 了就行,最终结果如下:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int n=1;
class Test {
public:
static int who(string s)//使用字符转化判断结果
{
switch(n)
{
case 1:
n++;
return 1;
case 2:
n++;
return 0;
case 3:
n++;
return 0;
case 4:
n++;
return 1;
case 5:
n++;
return 1;
case 6:
n++;
return 0;
case 7:
n++;
return 0;
case 8:
n++;
return 1;
case 9:
n++;
return 0;
case 10:
n++;
return 1;
}
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
点击提交——查看结果——
呵呵!还不错吧!大家赶紧去试试吧!
呵呵!还不错吧!大家赶紧去试试吧!