洞穴逃生 | 描述: | 精灵王子爱好冒险,在一次探险历程中,他进入了一个神秘的山洞。在洞穴深处,精灵王子不小心触动了洞穴内暗藏的机关,整个洞穴将很快塌陷, 精灵王子必须尽快逃离洞穴。精灵王子的跑步速度为17m/s,以这样的速度可能是无法逃出洞穴的。 庆幸的是精灵王子拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。 精灵王子的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 现在已知精灵王子的魔法初值M,他所在洞穴中的位置与洞穴出口之间的距离S,距离洞穴塌陷的时间T。 你的任务是写一个程序帮助精灵王子计算如何在最短的时间内逃离洞穴。 若能逃出,输出"Yes",并输出逃出所用的最短时间;若不能逃出,则输出"No",同时输出精灵王子在剩下的时间内能走的最远距离。 注意字母大小写。注意:精灵王子跑步、闪烁或休息活动均以秒(s)为单位。且每次活动的持续时间为整数秒。距离的单位为米(m)。 注:M、S、T均是大于等于0的整数。由输入保证取值合法性,考生不用检查。 提醒: 如果输入的S为0,则说明本身已经在出口,输出应为:Yes 0 如果输入的T为0(且S不为0),则说明已经没有时间了,输出应为:No 0 | 运行时间限制: | 无限制 | 内存限制: | 无限制 | 输入: | 输入格式: M S T | 输出: | 输出格式: Yes 逃出洞穴所用的最短时间 或 No 在洞穴塌陷前能逃跑的最远距离 | 样例输入: | 10
50
5 | 样例输出: | Yes 1 | #include <iostream>
#include<vector>
#include <list>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
void run(int M,int S,int T)
{
if(S==0)
{
cout << "Yes " << 0 << endl;
return;
}else if(T==0)
{
cout << "No " << 0 << endl;
return;
}
int maxD=0;
int minT=0;
for (int i=0;i<T;)
{
if ((M-10)>=0)
{
maxD+=60;
minT++;
M=M-10;
i++;
continue;
}
else if ((M-10)<=0)
{
int yumofa=M-10;
int tempT=0;
while (yumofa<=10)
{
yumofa+=4;
tempT++;
}
if ((tempT+1)>T-i)
{
maxD+=(T-i)*17;
minT+=(T-i);
}
else
{
i=i+tempT+1;
minT+=4;
maxD+=60;
}
if (maxD>=S)
{
cout << "Yes " << minT << endl;
return;
}
}
}
cout << "No " << maxD << endl;
}
void main()
{
int M,S,T;
cin>>M;
cin>>S;
cin>>T;
run(M,S,T);
}
解析9进制,11进制的字符串为10进制的数字输出 描述: 解析9进制,11进制的字符串为10进制的数字输出,输入的字符串有效位(0v0012345678)长度不超过8位, 前面的00不算做有效位。解析后以10进制的数字输出。 如果解析到非法字符串则返回-1 9进制: 9进制的数的范围:0,1,2,3,4,5,6,7,8 9进制的开始为:0V或者0v 9进制的正确实例:0V11 0v564 0V123 0v0784 0V0 0v 0V 9进制的错误实例:0V923 0vt12 00V21 0123 9进制转换为10进制:0V11 -> 10 0v564 -> 463 11进制: 11进制的数的范围:0,1,2,3,4,5,6,7,8,9,A(a) 11进制的开始为:0W或者0w 11进制的正确实例:0W11 0w564 0W123 0w0A8a 0W 0w 11进制的错误实例:0WB923 0wVaA 00W21 0WAx123 11进制转换为10进制: 0W11 -> 12 0w564 -> 675 #include <iostream>
#include<vector>
#include <list>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
int jinzhiConverter(string in)
{
int sum = 0;
int length = in.length();
if (length<2)
{
return -1;
}
if ((in[1] != 'v' && in[1] != 'w'&&in[1] != 'V' && in[1] != 'W') || in[0] != '0')
{
return -1;
}
else
{
if (length == 2)
{
return 0;
}
if (in[1] == 'v' || in[1] == 'V')
{
for (int i = 2; i<length; i++)
{
if (in[i] <= '8'&&in[i] >= '0')
{
sum = sum * 9 + in[i] - '0';
}
else
{
return -1;
}
}
}
else
{
for (int i = 2; i<length; i++)
{
if ((in[i] <= '9'&&in[i] >= '0') || in[i] == 'A' || (in[i] == 'a'))
{
if (in[i] == 'A' || (in[i] == 'a'))
{
sum = sum * 11 +10; // sum=sum*11+'a'-'0'; 这里之前ascii值弄错了
}
else{
sum = sum * 11 + in[i] - '0';
}
}
else
{
return -1;
}
}
}
}
return sum;
}
void main()
{
string in;
cin >> in;
cout << jinzhiConverter(in);
}
排号机 描述: 实现一个简易的银行排号叫号系统 get 取号 示例:"get"或"get vip" call 叫号 示例:"call" delete 删除号码 示例:"delete 5" count 获取当前排队总人数 示例:"count" countN 获取号码N以前的排队人数 示例:"countN" reset 重置排号机 示例:"reset" quit 退出排号机 示例:"quit" 运行时间限制: 无限制 内存限制: 无限制 输入: 每行只会有一条输入(比如:C语言可使用gets函数获取一行输入命令的字符串)。 1、若输入不符合要求(如:命令字非法,或其他认为输入的错误)均需输出"error" 2、每条输出后使用换行符隔开(如后面示例) 输出: 1)取号。可获取普通号和vip号码。如初始状态,输入"get",则获取普通号码,执行结果为"1", 如再次输入"get vip",则获取VIP号码,执行结果为"vip 2"。如果末尾的2号被删除,则再次调用"get"时应输出"2" VIP号码有绝对的优先级。普通号和vip号码统一编号,取号均为连续号码。号码从1开始编号,最大为100000. 2)叫号。获取当前应该处理用户的号码。例如当前排队号码为1 2 3 4 5 7,当输入"call",执行结果为"1",如1为vip号码, 则为"vip 1".如果再连续调用6次,第六次执行结果应为"error" 3)删除号码。客户不想办理时可删除号码,叫号时则跳过此号码。例如当前排队号码为1 2 3 4 5,输入"delete 5",执行结果为"5", 如果5为vip则显示"vip 5"。再次输出"delete 5",执行结果为"error" 4)获取当前排队总人数。获取当前排队人数。例如当前排队号码为1 2 3 4 5 6,执行结果为"6" 5)获取在某个号码之前排队的总人数。例如当前排队号码为1 2 3 4 5 7,输入"countN 7",执行结果为"5" 6、重置排号机。例如输入"reset",则重置排号机,进入初始状态,无需输出。 7、退出排号机。例如输入"quit",则退出排号机,无需输出。 样例输入: get get get get vip count countN 1 call quit 样例输出: 1 2 3 vip 4 4 1 vip 4 #include <iostream>
#include<vector>
#include <queue>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
map<string, int> m;
int numAll = 1;
class haoma
{
public:
haoma(int a, bool b, bool c)
{
num = a;
isVip = b;
isDelete = c;
}
int num;
bool isVip;
bool isDelete;
};
vector<haoma> v;
void queueSystem(string in)
{
string intemp;
int num = 0;
int k = in.find(' ');
if ((in.find(' ') != -1) && in != "get vip")
{
intemp = in.substr(0, in.find(" "));
string numS = in.substr(in.find(" "), in.length() - in.find(" "));
num = atoi(numS.c_str());
}
else
{
intemp = in;
}
/*m.insert(pair<string,int>("get",0));
m.insert(pair<string,int>("get vip",1));
m.insert(pair<string,int>("delete",2));
m.insert(pair<string,int>("count",3));
m.insert(pair<string,int>("countN",4));
m.insert(pair<string,int>("reset",5));
m.insert(pair<string,int>("quit",6));*/
if (intemp == "get")
{
vector<haoma>::iterator p = v.end();
if (v.size()!=0)
{
p--;
}
vector<haoma>::iterator p1 = v.begin();
int max = -1;
while (v.size() != 0) //从后向前找到那个被delete的号码
{
if (p == v.begin())
{
if (p->isDelete == true)
{
p1 = p;
max = p->num;
}
break;
}
if (p->isDelete==true)
{
p1 = p;
max = p->num;
p--;
}
else{
break; }
}
if (v.size() != 0 && p != (v.end() - 1)&& p1->isDelete == true)
{
p1->isDelete = false;
p1->isVip = false;
cout << max << endl;
}
else{
haoma tempHaoma(numAll, false, false);
v.push_back(tempHaoma);
cout << numAll << endl;
numAll++;
}
}
if (intemp == "get vip")
{
vector<haoma>::iterator p = v.end();
if (v.size() != 0)
{
p--;
}
vector<haoma>::iterator p1 = v.begin();
int max = -1;
while (v.size() != 0) //从后向前找到那个被delete的号码
{
if (p==v.begin())
{
if (p->isDelete == true)
{
p1 = p;
max = p->num;
}
break;
}
if (p->isDelete == true)
{
p1 = p;
max = p->num;
p--;
}
else{
break;
}
}
if (v.size() != 0&&p!=(v.end()-1)&&p1->isDelete == true)
{
p1->isDelete = false;
p1->isVip = true;
cout << "vip " << max << endl;
}
else{
haoma tempHaoma1(numAll, true, false);
v.push_back(tempHaoma1);
cout << "vip " << numAll << endl;
numAll++;
}
}
if (intemp == "delete")
{
vector<haoma>::iterator p = v.begin();
while (p != v.end())
{
if (p->num == num&&p->isDelete == false)
{
p->isDelete = true;
cout << num << endl;
return;
}
else if (p->num == num&&p->isDelete == false)
{
cout << "error" << endl;
return;
}
p++;
}
}
if (intemp == "count")
{
vector<haoma>::iterator p = v.begin();
int numtemp = 0;
while (p != v.end())
{
if (p->isDelete == false)
{
numtemp++;
}
p++;
}
cout << numtemp << endl;
}
if (intemp == "countN")
{
vector<haoma>::iterator p = v.begin();
int numtemp = 0; //
while (p != v.end())
{
if (p->num<num&&p->isDelete == false)
{
numtemp++;
}
p++;
}
if (numtemp == 0)
{
cout << numtemp + 1 << endl;
return;
}
cout << numtemp << endl;
}
if (intemp == "reset")
{
vector<haoma>::iterator p = v.begin();
while (p != v.end())
{
p = v.erase(p);
}
numAll = 1;
}
if (intemp == "call")
{
vector<haoma>::iterator p = v.begin();
vector<haoma>::iterator p1 = v.begin();
int min = 100001;
bool existV = false;
if (v.empty())
{
cout << "error" << endl;
return;
}
while (p != v.end())
{
if (!existV&&p->num<min&&p->isDelete == false)
{
min = p->num;
p1 = p;
}
if (existV&&p->num<min&&p->isDelete == false && p->isVip)
{
min = p->num;
p1 = p;
}
if (p->isVip&&!existV)
{
existV = true;
min = p->num;
p1 = p;
}
p++;
}
if (p1->isVip == true)
{
cout << "vip " << min << endl;
}
else{
cout << min << endl;
}
v.erase(p1);
}
}
void main()
{
string in[10000];
//int i = 0;
//while (in[i++] != "quit")
//{
// getline(cin, in[i]);
//}
//for (int j = 1; j<i; j++)
//{
// queueSystem(in[j]);
//}
queueSystem("get");
queueSystem("get");
queueSystem("call");
queueSystem("get");
queueSystem("delete 2");
queueSystem("get vip");
queueSystem("delete 4");
queueSystem("get");
queueSystem("count");
queueSystem("countN 1");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("reset");
queueSystem("get");
queueSystem("get");
queueSystem("call");
queueSystem("get");
queueSystem("delete 3");
queueSystem("get vip");
queueSystem("count");
queueSystem("countN 1");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("call");
queueSystem("quit");
}
成都麻将胡牌规则 | 描述: | 说起麻将,那可是川渝市民的最爱,无论亲朋好友聚会,还是业务谈判,总是少不了麻将的声音。 成都麻将只能包括3种类型:条,筒,万。没有“门、东南西北、红中”。 每种牌都是数字从1到9,每个数字有4张,共36张。筒,万,条均一样。 胡牌简化规则如下: 1.必须有一个对子,即两张相同的牌,比如:两个2筒,两个4条等。 2.剩余的牌,每3张需要凑成一个有效牌,比如:3个一样的牌(3个2筒),或者3个顺子(1条2条3条), 如果所有的牌都能够凑好,再满足规则2和1,有一个对子,并且所有的牌只有两种类型,那么就可以胡牌了。 3.假设牌不会出现碰的情况,即输入的牌肯定是13张。 4.输入牌肯定都是麻将牌,不用考虑异常输入;也不用考虑会输入“门”,“红中”等成都麻将中不会出现的牌。 5.条用T表示,D用D表示,万用W标识。 6.不用考虑输入的合法性,这个由函数的使用者保证。输入的牌为字符串,字母为大写的TDW” 要求根据13个已知输入,判断可以胡那几张牌。 | 运行时间限制: | 无限制 | 内存限制: | 无限制 | 输入: | 输入13张麻将牌,如"1T8T6W6W5D4W1T3W6W2W5D6T1T" | 输出: | 输出胡牌个数和要胡的牌, 其中胡牌个数占一行输出,胡哪一张牌占一行输出, 胡多张牌,输出数促按照T/D/W的顺序从小到大排列(如1T5T6D7D3W8W)。 1 7T | 样例输入: | 1T8T6W6W5D4W1T3W6W2W5D6T1T | 样例输出: | 1
7T | 答案提示: | | 这道题规则我没太明白 是不是一副牌只能有且只有一个对子? #include<iostream>
//#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class maJiang
{
public:
int num;
char huaSe;
maJiang(int in, char huase) :num(in),huaSe(huase){}
};
bool comp(maJiang& lhs, maJiang& rhs)
{
if (lhs.huaSe>rhs.huaSe)
{
if (lhs.huaSe == 'W' || rhs.huaSe == 'W')
{
return false;
}
else
{
return true;
}
}
else if (lhs.huaSe < rhs.huaSe)
{
if (lhs.huaSe == 'W' || rhs.huaSe == 'W')
{
return true;
}
else
{
return false;
}
}
else
{
if (lhs.num >= rhs.num)
{
return false;
}
else
{
return true;
}
}
}
void findHuase(string in)
{
vector<maJiang> v;
vector<maJiang> vDan;
vector<maJiang> vDuizi;
///先处理in 存入vector 再把vector排序
for (size_t i = 0; i < in.size(); i=i+2)
{
int num = in[i] - '0';
char huase = in[i + 1];
maJiang tempM(num, huase);
v.push_back(tempM);
}
sort(v.begin(), v.end(), comp);
vector<maJiang>::iterator p = v.begin();
int i = 0;
int sanNum = 0;
int sanShunNum = 0;
int duiNum = 0;
int danNum = 0;
while (i<13)
{
//连续三个相同
if(i < 11 && v[i].huaSe == v[i + 1].huaSe &&v[i + 1].huaSe == v[i + 2].huaSe&&v[i].num == v[i + 1].num &&v[i + 1].num == v[i + 2].num)
{
sanNum++;
i = i + 3;
continue;
}
//连续三个花色相同,数字连续
if (i < 11 && v[i].huaSe == v[i + 1].huaSe &&v[i + 1].huaSe == v[i + 2].huaSe&&(v[i].num+1) == v[i + 1].num &&(v[i + 1].num+1) == v[i + 2].num)
{
sanShunNum++;
i = i + 3;
continue;
}
//出现对子
if (i < 12 && v[i].huaSe == v[i + 1].huaSe &&v[i].num == v[i + 1].num )
{
vDuizi.push_back(v[i]);
vDuizi.push_back(v[i + 1]);
duiNum++;
i = i + 2;
continue;
}
//连续两个花色相同,数字连续
if (i < 12 && v[i].huaSe == v[i + 1].huaSe &&v[i].num == v[i + 1].num)
{
//todo
vDan.push_back(v[i]);
vDan.push_back(v[i+1]);
i = i + 2;
continue;
}
else
{
vDan.push_back(v[i]);
i++;
}
}
//排好序输出
if (duiNum == 0 && vDan.size() == 1)
{
cout << 1<<endl;
cout << vDan[0].num << vDan[0].huaSe;
}
if (duiNum == 1 && vDan.size() == 2)
{
if (vDan[1].num - vDan[0].num == 1)
{
cout << 2 << endl;
cout << vDan[0].num -1 << vDan[1].huaSe << vDan[1].num + 1 << vDan[1].huaSe;
}
if (vDan[1].num - vDan[0].num == 2)
{
cout << 1 << endl;
cout << vDan[0].num + 1 << vDan[0].huaSe;
}
}
if (duiNum == 2 && vDan.size() == 0)
{
cout << 2 << endl;
cout << vDuizi[0].num << vDuizi[0].huaSe;
cout << vDuizi[2].num << vDuizi[2].huaSe;
}
else{
cout << 0;
}
}
void main()
{
string in;
cin >> in;
findHuase(in);
//findHuase("1T8T6W6W5D4W1T3W6W2W5D6T7T");
//findHuase("1T1T1T3D3D3D4W4W4W5D5D5T6T");
//while (1)
//{
//}
}
普通题 描述:给定一个输入,介于0~999999之间,并且给定的数是回文数,e.g. 123321,那么统计直到下一个回文数之间的间隔, 并且当统计到999999时,下一个数为0,即是循环计数。 e.g. 输入:123321 输出:1100 #include<iostream>
#include<string>
using namespace std;
bool check(int in)
{
int length=1;
int in1=in;
while(in/10!=0)
{
in/=10;
length++;
}
char* c=new char[length];
//itoa(in,c,10);
for(int i=length-1;i>=0;i--)
{
c[i]=in1%10+'0';
in1/=10;
}
for(int i=0;i<(length/2);i++)
{
if(c[i]!=c[length-1-i])
{
return false;
}
}
return true;
}
void main()
{
while(1)
{
int in;
cin>>in;
int tempin=in;
if(in==999999) {cout<<1<<endl;continue;}
while(!check(++in))
{
}
cout<<in<<endl;
cout<<in-tempin<<endl;
}
}
描述:字符串匹配问题,给定两个字符串,求字符串2,在字符串1中的最先匹配结果。字符串2中可以存在'*'符号, 且该符号可以代表任意字符,即字符串2中存在通配符。 e.g. 输入:abcdefghabef, a*f 输出:abcdef #include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
void checkInString(string lhs,string rhs)
{
if(string::npos==rhs.find('*'))
{
if(lhs.find(rhs)==string::npos)
{
cout<<"NULL";
}
else
{
cout<<rhs;
}
}
else
{
int rLength=rhs.length();
int lLength=lhs.length();
int pL=0,pR=0;
if(rhs.at(0)=='*'&& rLength==1)
{
cout<<lhs;
return;
}
if(rhs.at(0)!='*')
{
while(lhs.at(pL)!=rhs.at(0) && pL<lLength)
{
pL++;
}
if(pL==lLength)
{
cout<<"NULL";
return;
}
}
for(int i=1;i<rLength;i++)
{
if(rhs.at(i)=='*')
{
if(i==rLength-1)
{
pR=lLength-1;
}
else
{
continue;
}
}
else
{
while(lhs.at(pR)!=rhs.at(i) && pR<lLength)
{
pR++;
}
}
}
for(int j=pL;j<=pR;j++)
cout<<lhs[j];
}
}
void main()
{
while(1)
{
string in1,in2;
cin>>in1;
cin>>in2;
checkInString(in1,in2);
}
}
朋友圈转发信息 |