状态 | 题号 | 竞赛题号 | 标题 |
---|---|---|---|
× | 1092 | A | |
× | 1145 | B | |
× | 1144 | C | |
× | 1202 | D | |
× | 1243 | E | |
× | 1473 | F | |
× | 1474 | G | |
× | 1501 | H | |
× | 1541 | I | |
× | 1042 | J | |
× | 1043 | K | |
× | 1571 | L |
1092.童年的回忆——计算24 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 很多年过去了,每当想起儿时跟表弟玩计算24的游戏时的情景,还会情不自禁地微微一笑。 游戏的规则很简单:一副扑克牌,乱序后每局抽出4张,计算牌面点数经四则运算是否能得到24。先计算出的人扼要说出计算方法,验证无误后获得本局比赛胜利,得到4张牌。全部牌用完后谁手中的牌多即获得最后的胜利! 有些题目很简单,如2,2,2,3,常常看到你争我抢的局面,而有的题目则不太容易算出,甚至可能误判为无解,如2,4,9,10…… 现在,我们都学会了编程。为了在多年后再一争高下,我们决定进行一次新的比拼:看谁写出的程序能既快又准地算出结果!比赛的基本规则不变,即仍是每局4个整数,运用四则运算(可以加括号),但为了降低程序设计的难度,除法的结果只保留整数部分,即5/2=2。 怎么样,你是不是也想加入我们的比赛呢?看看谁能获得最后的胜利! 输入 本题包含多个测例。 数据的第一行有一个整数N(0从第二行开始的N行,各包含4个不大于15的以空格分隔的非零整数。 输出 对于每个测例,如果可以计算得到24,则输出“Yes”,否则输出“No”。每个输出占一行。 输入样例 2 2 2 3 3 2 4 9 10 输出样例 Yes Yes 提示 来源 icso.
1092.童年的回忆——计算24
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int cal(int x, int y, int op); //定义加减乘除运算 int search(int m); //回溯法遍历所有数字顺序 int test(); //遍历所有运算符 int calculate(int op1, int op2, int op3); //遍历所有括号形式 int n; ]; int main() { while(cin>>n) { while(n--) { ; j<; j++) { cin>>a[j]; } )) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } ; } /*回溯法遍历所有数字顺序*/ int search(int m) { ) { ) ; } else { ; i++) { swap(a[i], a[m]); ) == ) { ); } swap(a[i], a[m]); } } ; } /*遍历所有运算符*/ int test() { ; i<; i++) ; j<; j++) ; k<; k++) ) ; ; } /*遍历所有括号形式*/ int calculate(int op1, int op2, int op3) { ], a[], op1), a[], op2), a[], op3) == ) { ); } ], a[], op1), cal(a[], a[], op3), op2) == ) { ); } ], cal(a[], a[], op2), op1), a[], op3) == ) { ); } ], cal(cal(a[], a[], op2), a[], op3), op1) == ) { ); } ], cal(a[], cal(a[], a[], op3), op2), op1) == ) { ); } ); } /*定义加减乘除运算*/ int cal(int x, int y, int op) { switch(op) { : return x + y; : return x - y; : return x * y; : ) return x / y; else ; //返回一个很大的数即刻 } }
代码A
.循环赛日程表 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 用分治算法生成循环赛日程表(1到2的n次方个人) 输入 一个小于等于7的正整数n 输出 循环赛日程表(1到2的n次方个人) 输入样例 输出样例 提示 来源
E1243.循环赛日程表
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; void creatTable(int n); void printTable(int n); ][]; //行和列都从1开始计数 int main() { int n; while(cin>>n) { creatTable(n); printTable(n); } ; } void creatTable(int n) { peo[][] = ; peo[][] = ; peo[][] = ; peo[][] = ; ; k<=n; k++)//一共还需要分治n-1次,这是第2次 { )); //左上角的子方阵的长度 int now = pow(2.0, double(k)); //当前大方阵的长度 ; i<=now; i++) { ; j<=now; j++) { /*通过左上角填充左下角,左下角元素 = 左上角对应元素 + 2^(x-1)*/ peo[i][j] = peo[i-pre][j] + pre; } } ; i<=pre; i++) { ; j<=now; j++) { /*通过左下角填充右上角,右上角元素 = 左下角对应元素*/ peo[i][j] = peo[i+pre][j-pre]; } } ; i<=now; i++) { ; j<=now; j++) { /*右下角元素 = 左上角元素*/ peo[i][j] = peo[i-pre][j-pre]; } } } } void printTable(int n) { int num = pow(2.0, double(n)); //人数=2的n次方 ; x<=num; x++) { ; y<num; y++) { cout<<peo[x][y]<<" "; } cout<<peo[x][num]; cout<<endl; } }
代码E
.括号匹配 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 假设一个算术表达式中可以包含三种括号:圆括号"("和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用,如:...[...(...)...{...{...}...[...]...}...]...,编写程序判别给定表达式中所含括号是否正确配对出现。 输入 输入一个由这几种括号组成的字符串,字符串长度不大于100。 输出 若正确则输出"Yes",否则输出"No"。注意字母的大小写,结尾带回车。 输入样例 {()[]}{} 输出样例 Yes
1473.括号匹配
#include <cstdio> #include <iostream> #include <cstring> #include <stack> using namespace std; int main() { string str; while(cin>>str) { stack<char> stack_str; ]==]==]=='}') cout<<"No"<<endl; else { ; i<str.length(); i++) //string类的length()或者size()函数返回的是unsigned integer(无符号数)类型。 { if(str[i]=='(' || str[i]=='[' || str[i]=='{') stack_str.push(str[i]); if(str[i]==')' && stack_str.top()=='(') { stack_str.pop(); continue; } if(str[i]==']' && stack_str.top()=='[') { stack_str.pop(); continue; } if(str[i]=='}'&& stack_str.top()=='{') { stack_str.pop(); continue; } } if(stack_str.empty()) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } ; }
代码F
.四则元算表达式转换为逆波兰式 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 假设表达式由单字母整数类型变量和双目四则运算符构成("+","-","*","/"),写一个程序,将一个通常书写形式且书写正确的表达式转换为逆波兰式。 输入 输入一个完整的正确的四则运算表达式,长度不超过100(其中仅含有:"("、")"、"a"、"b"和"c"五种字符)。 输出 输出这个表达式的逆波兰表达式。注意结尾带回车。 输入样例 输入样例一:(a+b) 输入样例二:((a+b)*(a-c)) 输入样例三:((a*(b+c))-(a/c)) 输出样例 输出样例一:ab+ 输出样例二:ab+ac-* 输出样例三:abc+*ac/-
1474.四则元算表达式转换为逆波兰式
#include <cstdio> #include <iostream> #include <cstring> #include <stack> using namespace std; int main() { ]; stack<char> s; while(cin>>str) { while(!s.empty()) //清空栈 s.pop(); ; while(str[i++] != '\0') { if(str[i] == '(') continue; else if(str[i]== 'a' || str[i]=='b' || str[i]=='c') cout<<str[i]; else if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/') s.push(str[i]); else if(str[i] == ')') { cout<<s.top(); s.pop(); } } cout<<endl; } ; }
代码G
.用括号法递归建立二叉树 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 如果用大写字母标识二叉树节点,则一棵二叉树可以用以下字母序列建立,#表示空节点。试写一个递归算法,有这种形式的字符序列,建立相应的二叉树的二叉链表存储结构,并按层次遍历输出。如一棵二叉树可表示为:A(B(#,D),C(E(#,F),#)) 输入 按题中要求,用括号法输入二叉树序列,#表示空节点 输出 按层次遍历建立好的二叉树并输出 输入样例 A(B(#,D),C(E(#,F),#)) 输出样例 ABCDEF
1501.用括号法递归建立二叉树
#include <iostream> #include <cstdio> #include <cstring> using namespace std; void printBinary(); void createBinary(char c); ]; ]; //用数组存储二叉树,下标2i代表i的左孩子,2i+1代表i的右孩子 int pos; //用来记录二叉树下标 ; //记录二叉树的长度 int main() { while(cin>>str) { pos = ; //初始从1开始,不然0*2=0 ; i<; i++) BinaryTree[i] = '#'; //二叉树初始化为0 ; while(str[j]!='\0') { createBinary(str[j]); j++; } printBinary(); } ; } /*将c插入二叉树数组*/ void createBinary(char c) { if((c>='A' && c<='Z') || c=='#') { BinaryTree[pos] = c; length++; } else if(c=='(') { pos = pos * ; } else if(c==',') { pos += ; } else if(c==')') { pos /= ; } } void printBinary() { ; i<; i++) { if(BinaryTree[i] != '#') cout<<BinaryTree[i]; } cout<<endl; }
代码H
.加1乘2平方 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 最简单的队列的使用 #include <iostream> #include <queue> using namespace std; queue<int> q1; int main() { int temp, x; q1.push();//入队 q1.push();//入队 temp = q1.front();//访问队首元素 q1.pop();//出队 q1.empty();//判队列是否为空 q1.back();//返回队尾元素 q1.size();//返回队列长度 } 给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次 输入 输入两个10000以内的正整数m和n,且m小于n 输出 输出从m变化到n的最少次数 输入样例 输出样例
I 1541.加1乘2平方
#include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; int bsf(); int m, n; ]; //visited[i]=3 代表访问i的步数是3 queue<int> q; int main() { while(cin>>m>>n) { memset(visited, , sizeof(visited)); cout<<bsf()<<endl; } ; } int bsf() { q.push(m); visited[m] = ; while(!q.empty()) { int temp = q.front(); q.pop(); if(temp == n) { return visited[n]; } <=n && !visited[temp+]) { q.push(temp+); visited[temp+] = visited[temp] + ; } <=n && !visited[temp*]) { q.push(temp*); visited[temp*] = visited[temp] + ; } if(temp*temp<=n && !visited[temp*temp]) { q.push(temp*temp); visited[temp*temp] = visited[temp] + ; } } ; }
代码I