[蓝桥杯]2013蓝桥省赛B组题目及详解
- /*———————————————————————————————————————————————————————————
- 题目:2013 高斯日记T-1
- 问题描述:
- 大数学家高斯有一个好习惯:无论如何都要记日记。
- 他的日记有一股与众不同的地方,他从不注明年月日,而是用一个整数代替:
- 比如4210。后来人们知道,那个整数是日记,他代表高斯出生后的第几天,
- 这或许也是好习惯,他时刻提醒着主人:日记又过去一天,还有多少时光
- 可以浪费呢?高斯出生于:1777年4月30日。
- 在高斯发现一个重要定理的日记上标注着:5343
- 因此可以算出那天是:1791年12月15日。
- 高斯获得博士学位的那天日记上写着:8113。
- 请你算出高斯获得博士学位的年月日。
- 输出格式:yyyy-mm-dd
- 样例输出:1980-03-21
- 数据规模与约定
- ————————————————————————————————————————————————————————————*/
- //高斯日记 //结果填空题可以采用excel或者手算
- //C++
- #include <iostream>
- using namespace std;
- bool isLeapYear(int y)
- {
- return (y % == && y % != ) || (y % == );
- }
- int main(int argc, const char *argv[])
- {
- int y = ; //年
- int m = ; //月
- int d = ; //日期
- for (int i = ; i < ; ++i) //计数器
- {
- d++; //
- if (m == && d == )
- {
- y++;
- m = ;
- d = ;
- continue;
- }
- if ((m == || m == || m == || m == || m == || m == ) && d == )
- {
- m++;
- d = ;
- continue;
- }
- if ((m == || m == || m == || m == ) && d == )
- {
- m++;
- d = ;
- continue;
- }
- if (m == && isLeapYear(y) && d == )
- {
- m++;
- d = ;
- continue;
- }
- if (m == && !isLeapYear(y) && d == )
- {
- m++;
- d = ;
- continue;
- }
- }
- cout << y << " " << m << " " << d << endl;
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-2 标题: 马虎的算式 简单枚举
- 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
- 有一次,老师出的题目是:36 x 495 = ?
- 他却给抄成了:396 x 45 = ?
- 但结果却很戏剧性,他的答案竟然是对的!!
- 因为 36 * 495 = 396 * 45 = 17820
- 类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
- 假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
- 能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
- 请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
- 满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
- 答案直接通过浏览器提交。注意:只提交一个表示最终统计种类数的数字,
- 不要提交解答过程或其它多余的内容。
- ————————————————————————————————————————————————————————————*/
- //C++
- #include<iostream>
- using namespace std ;
- int main()
- {
- int ans = ;
- for (int a = ; i < ; ++i) //a
- {
- for (int b = ; b < ; ++b) //b
- {
- if (b != a)
- for (int c = ; c < ; ++c) //c
- {
- if (c != a && c != b)
- for (int d =; d < ; ++d) //d
- if (d != a && d != b && d != c)
- for (int e = ; e < ; ++e) //e
- {
- if (e != a && e != b && e != c && e != d)
- {
- ab * cde = adb * ce
- if ((a*+b)*(c*+d*+e)==(a*+d*+b)*(c*+e))
- {
- printf ("(%d810+%d)*(%d*100+%d*10+%d)==(%d*100+%d*10+%d)*(%d*10+%d)==%d\n",
- a,b,c,d,e,a,d,b,c,e,(a*+b)*(c*+d*+e)) ;
- ans ++ ;
- }
- }
- }
- }
- }
- }
- }
- int ans = ;
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-3题目标题: 第39级台阶 类似斐波拉契数列 用递归
- 小明刚刚看完电影《第39级台阶》,离开电影院的时候,
- 他数了数礼堂前的台阶数,恰好是39级!
- 站在台阶前,他突然又想着一个问题:
- 如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。
- 那么,上完39级台阶,有多少种不同的上法呢?
- 请你利用计算机的优势,帮助小明寻找答案。
- 要求提交的是一个整数。
- 注意:不要提交解答过程,或其它的辅助说明文字。
- 去掉一个条件:偶数步,只问只能迈上1个或2个台阶的条件下一共有多少种走法呢?
- f(n=39){return f(n-1)+f(n-2)}
- ————————————————————————————————————————————————————————————*/
- /*去掉一个条件:偶数步,只问只能迈上1个或2个台阶的条件下一共有多少种走法
- f(n=39){return f(n-1)+f(n-2)} */
- #include <iostream>
- using namespace std ;
- /**
- * @parm n 剩下的阶梯数
- * @parm step 已走的步数
- */
- void f(int n,int step)
- {
- if (n < )
- return ;
- if (n == && step % ==)
- {
- ans ++ ;
- return ;
- }
- f(n - ,step + ) ;
- f(n - ,step + ) ;
- }
- int main(int argc,const char *argv[])
- {
- f(,) ;
- cout << ans << endl ;
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-4标题: 黄金连分数 类似斐波拉契数列
- 黄金分割数0.61803... 是个无理数,这个常数十分重要,
- 在许多工程问题中会出现。有时需要把这个数字求得很精确。
- 对于某些精密工程,常数的精度很重要。
- 也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,
- 对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!
- 言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。
- 比较简单的一种是用连分数:
- 1
- 黄金数 = ---------------------
- 1
- 1 + -----------------
- 1
- 1 + -------------
- 1
- 1 + ---------
- 1 + ...
- 这个连分数计算的“层数”越多,它的值越接近黄金分割数。
- 请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。
- 小数点后3位的值为:0.618
- 小数点后4位的值为:0.6180
- 小数点后5位的值为:0.61803
- 小数点后7位的值为:0.6180340
- (注意尾部的0,不能忽略)
- 你的任务是:写出精确到小数点后100位精度的黄金分割值。
- 注意:尾数的四舍五入! 尾数是0也要保留!
- 显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。
- 注意:不要提交解答过程,或其它辅助说明类的内容。
- ————————————————————————————————————————————————————————————*/
- //C++
- /** 小数点后一百位,属于高精度计算。根据关系把等式列出来
- * 解法一:
- * 1.转为求斐波拉契数列的n和n+1项
- * 2.n取多少?再增加n,小数点后的101位没有变化
- * 3.不能用C语言定义的整数型直接运算,而要手工地写大数的加减乘除
- */
- #include <string>
- #include <iostream>
- #include <sstream>
- #include <algorithm>
- using namespace std ;
- int n = ;
- void i2s(int num, string &str)
- {
- stringstream ss ;
- ss << num ;
- ss >> str ;
- }
- string add(string a, string b)
- {
- a = a.substr(a.find_first_not_of('')) ;
- b = b.substr(b.find_first_not_of('')) ;
- long long lenA = a.length() ;
- long long lenB = b.length() ;
- long long len = max(lenA, lenB) + ;
- // 翻转,便于从低位逐步求和
- reverse(a.begin(), a.end()) ;
- reverse(b.begin(), b.end()) ;
- string ans(len, '') ;//初始化答案为len长,全部为字符0
- // 把a拷贝到ans中
- for (int i = ; i < lenA; ++i)
- {
- ans[i] = a[i] ;
- }
- int tmp = ;//tmp是上一位相加后的进位
- for (int i = ; i < len; ++i)
- {
- if (i < b.length())
- tmp += (ans[i] - '') + (b[i] - '');//假设为18
- else
- tmp += (ans[i] - '') ;
- ans[i] = tmp % + '' ;//8 8+'0'
- tmp /= ;//
- }
- reverse(ans.begin(), ans.end()) ;
- return ans.substr(ans.find_first_not_of('')) ;
- }
- /*大数减法*/
- int cmp(string a, string b)
- {
- unsigned long i1 = a.find_first_not_of('') ;
- if (i1 == string::npos)a = '' ;
- else a.substr(i1) ;
- unsigned long i2 = b.find_first_not_of('') ;
- if (i2 == string::npos)b = '' ;
- else b.substr(i2) ;
- if (a.length() > b.length()) return ;
- else if (a.length() < b.length()) return - ;
- else
- {
- //长度相等
- if (a < b)return -;
- if (a > b)return ;
- else return ;
- }
- }
- //此处,a一定大于等于b
- string subtract(string a, string b)
- {
- // 完整的减法里面,a可以小于b,这时结果为负数,交换ab进行下面的代码
- // 1.翻转
- reverse(a.begin(), a.end()) ;
- reverse(b.begin(), b.end()) ;
- // 2.按位做减法
- for (int i = ; i < b.length(); ++i)
- {
- if (a[i] >= b[i])
- {
- a[i] = a[i] - b[i] + '' ;
- }
- else //就要借
- {
- int k = ;
- while (a[i + k] == '')
- {
- a[i + k] = '';
- k++;
- }
- // 这里可以保证i+k这一位上不是0
- a[i + k] = a[i + k] - '' + '';
- a[i] = (a[i] - '' + ) - (b[i] - '') + '';
- }
- }
- reverse(a.begin(), a.end());
- if (a.find_first_not_of('') == string::npos)return "";
- return a.substr(a.find_first_not_of(''));
- }
- /*转换成减法*/
- string divide(string a, string b)
- {
- // 只考虑a<b的情况
- string ans = "0.";
- // 转化成减法
- for (int i = ; i < ; ++i)
- {
- //101次
- a.append("");
- int t = ;
- while (cmp(a, b) >= )
- {//a>=b
- a = subtract(a, b);//不停地做减法
- t++;//记录减法做了多少次
- }
- string t_str;
- i2s(t, t_str);
- ans.append(t_str);
- }
- return ans;
- }
- int main(int argc, const char *argv[])
- {
- string a = "";
- string b = "";
- cout << subtract(a, b) << endl;
- for (int i = ; i <= n; ++i)
- {
- string tmp = b;
- b = add(a, b);
- a = tmp;
- // cout << b << " " << endl;
- }
- // a b是斐波那契的n-1和n项
- string ans = divide(a, b);
- cout << ans << endl;
- cout << ans.length()- << endl;
- return ;
- }
- //【代码填空题】
- /*———————————————————————————————————————————————————————————
- T-5题目标题:前缀判断
- 如下的代码判断 needle_start指向的串是否为haystack_start
- 指向的串的前缀,如不是,则返回NULL。
- 比如:"abcd1234" 就包含了 "abc" 为前缀
- char* prefix(char* haystack_start, char* needle_start)
- {
- char* haystack = haystack_start;
- char* needle = needle_start;
- while(*haystack && *needle)
- {
- if(______________________________) return NULL;
- //填空位置
- }
- if(*needle) return NULL;
- return haystack_start;
- }
- 请分析代码逻辑,并推测划线处的代码,通过网页提交。
- 注意:仅把缺少的代码作为答案,
- 千万不要填写多余的代码、符号或说明文字!!
- ————————————————————————————————————————————————————————————*/
- #include <iostream>
- using namespace std;
- /**
- *
- * @param haystack_start 母串
- * @param needle_start 前缀
- * @return
- */
- char *prefix(char *haystack_start, char *needle_start)
- {
- char *haystack = haystack_start;
- char *needle = needle_start;//前缀
- while (*haystack && *needle) //两个指针都没有越界
- {
- //代码填空处
- // if(*(haystack++) != *(needle++++) ) return NULL;
- // 移动指针,并判断 取内容,再左移动
- if (*(haystack++) != *(needle++))return NULL;
- }
- if (*needle) return NULL;
- return haystack_start;
- }
- //测试结果是否正确
- int main(int argc, const char *argv[])
- {
- cout << prefix("abcd123", "abd") << endl;
- return ;
- }
- /*思路:先注释掉填空部分,再编译通过,由调试结果观察推断*/
- /*代码填空:*/
- /*———————————————————————————————————————————————————————————
- T-6 标题:三部排序 快速排序的一个变种
- 一般的排序有许多经典算法,如快速排序、希尔排序等。
- 但实际应用时,经常会或多或少有一些特殊的要求。
- 我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
- 比如,对一个整型数组中的数字进行分类排序:
- 使得负数都靠左端,正数都靠右端,0在中部。
- 注意问题的特点是:负数区域和正数区域内并不要求有序。
- 可以利用这个特点通过1次线性扫描就结束战斗!!
- 以下的程序实现了该目标。
- 其中x指向待排序的整型数组,len是数组的长度。
- void sort3p(int* x, int len)
- {
- int mod = 0;
- int left = 0;
- int right = len-1;
- while(mod<=right)
- {
- if(x[mod]<0)
- {
- int t = x[left];
- x[left] = x[mod];
- x[mod] = t;
- left++;
- mod++;
- }
- else if(x[mod]>0)
- {
- int t = x[right];
- x[right] = x[mod];
- x[mod] = t;
- right--;
- }
- else
- {
- /*填空位置
- __________________________; //填空位置
- }
- }
- }
- 如果给定数组:
- 25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
- 则排序后为:
- -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25
- 请分析代码逻辑,并推测划线处的代码,通过网页提交
- 注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!
- ————————————————————————————————————————————————————————————*/
- #include<iostream>
- using namespace std ;
- void sort3p(int* x, int len)
- {
- int mod = ;
- int left = ;
- int right = len-;
- while(mod<=right)
- {
- if(x[mod]<)
- {
- int t = x[left];
- x[left] = x[mod];
- x[mod] = t;
- left++;
- mod++;
- }
- else if(x[mod]>)
- {
- int t = x[right]; //交换
- x[right] = x[mod];
- x[mod] = t;
- right--;
- }
- else{
- //__________________________; //填空位置
- //x[mod]==0
- mod++ ;
- //left //left指向左侧第一个大于0
- //right //right指向右侧末尾大于0
- }
- }
- }
- int main()
- {
- int arr[] = {,,-,,,-,,,,,-,,-,} ;
- sort3p(arr,arr.length()) ;
- for (int i = ; i < ; i++)
- {
- cout << arr[i] << " " ;
- }
- return ;
- }
- //【编程大题】
- /*———————————————————————————————————————————————————————————
- T-7标题:错误票据 字符串的处理
- 某涉密单位下发了某种票据,并要在年终全部收回。
- 每张票据有唯一的ID号。全年所有票据的ID号是连续的,
- 但ID的开始数码是随机选定的。工作人员疏忽,
- 在录入ID号的时候发生了一处错误,
- 造成了某个ID断号,另外一个ID重号。
- 你的任务是通过编程,找出断号的ID和重号的ID。
- 假设断号不可能发生在最大和最小号。
- 要求程序首先输入一个整数N(N<100)表示后面数据行数。
- 接着读入N行数据。
- 每行数据长度不等,是用空格分开的若干个(不大于100个)
- 正整数(不大于100000)每个整数代表一个ID号。
- 要求程序输出1行,含两个整数m n,用空格分隔。
- 其中,m表示断号ID,n表示重号ID
- 例如:
- 用户输入:
- 2
- 5 6 8 11 9
- 10 12 9
- 则程序输出:
- 7 9
- 再例如:
- 用户输入:
- 6
- 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
- 172 189 127 107 112 192 103 131 133 169 158
- 128 102 110 148 139 157 140 195 197
- 185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
- 149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
- 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
- 则程序输出:
- 105 120
- 资源约定:
- 峰值内存消耗 < 64M
- CPU消耗 < 1000ms
- 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
- 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
- 注意: main函数需要返回0
- 注意: 只使用ANSI C/ANSI C++ 标准,
- 不要调用依赖于编译环境或操作系统的特殊函数。
- 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
- 不能通过工程设置而省略常用头文件。
- 提交时,注意选择所期望的编译器类型。
- /*原始数据连续,输入的时候是乱序的,求出断开的号码和重复的号码*/
- ————————————————————————————————————————————————————————————*/
- /*
- 原始数据连续,但输入的时候是乱序的,求出断开的号码和重复的号码*/
- #include <iostream>
- #include <sstream>
- #include <algorithm>
- using namespace std;
- const int MaxN = ;
- int line;
- int data[MaxN];
- void s2i(string &str, int &num)
- {
- stringstream ss;
- ss << str;
- ss >> num;
- }
- int main(int argc, const char *argv[])
- {
- scanf("%d", &line);
- getchar();
- int index = ;
- for (int i = ; i < line; ++i)
- {
- string s;
- getline(cin, s);
- istringstream iss(s);
- string tmp;
- while (getline(iss, tmp, ' '))
- {
- s2i(tmp, data[index++]);
- }
- }
- // 最终index就是数据的个数
- // cout << index << endl;
- //排序
- sort(data, data + index);
- int a, b;
- for (int i = ; i < index; ++i)
- {
- if (data[i] == data[i - ] + )a = data[i] - ;//printf("%d ", data[i] - 1);
- if (data[i] == data[i - ]) b = data[i];//printf("%d", data[i]);
- }
- printf("%d %d", a, b);
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-8 翻硬币 字符串处理
- 题目标题:翻硬币
- 小明正在玩一个“翻硬币”的游戏。
- 桌上放着排成一排的若干硬币。我们用 * 表示正面,
- 用 o 表示反面(是小写字母,不是零)。
- 比如,可能情形是:**oo***oooo
- 如果同时翻转左边的两个硬币,则变为:oooo***oooo
- 现在小明的问题是:如果已知了初始状态和要达到的目标状态,
- 每次只能同时翻转相邻的两个硬币,那么对特定的局面,
- 最少要翻动多少次呢?
- 我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
- 程序输入:
- 两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
- 程序输出:一个整数,表示最小操作步数
- 例如:
- 用户输入:
- **********
- o****o****
- 程序应该输出:5
- 再例如:
- 用户输入:
- *o**o***o***
- *o***o**o***
- 程序应该输出:1
- 资源约定:
- 峰值内存消耗 < 64M
- CPU消耗 < 1000ms
- 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
- 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
- 注意: main函数需要返回0
- 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
- 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
- 不能通过工程设置而省略常用头文件。
- 提交时,注意选择所期望的编译器类型。
- ————————————————————————————————————————————————————————————*/
- //
- /*推演例子,从中寻求规律
- 找第一个和最后一个不同。
- 求最值的常用方法:搜索:宽搜、深搜、枚举 ->穷举
- 动态规划:小规模计算
- 贪心:
- 闭式:
- 宽搜一般用于状态转移的次数
- 深搜一般用于穷举所有的可能性 */
- //解法一 状态的转移 使用宽搜
- /*
- 一步能走的状态,加入到队列中,宽搜使用队列*/
- #include <iostream>
- #include <queue>
- #include <set>
- using namespace std;
- typedef struct stateAndLevel
- {
- string str;
- int level;
- } stateAndLevel;
- queue<stateAndLevel> queue1;
- set<string> set1;
- int n;
- int main(int argc, const char *argv[]) {
- string src;
- string target;
- getline(cin, src);
- getline(cin, target);
- n = src.length();
- stateAndLevel first = {src, };
- queue1.push(first);//队列的第一个元素就是原串
- while (!queue1.empty()) {
- //获取并弹出队列首部
- stateAndLevel &front = queue1.front();
- queue1.pop();
- string basicString = front.str;
- // 如果队首元素和目标一致,可以终止程序
- if (basicString.compare(target) == ) {
- cout << front.level << endl;//输出层次,也就是变化多少次到达了这个状态
- return ;
- }
- // 把已经处理过的字符串加入set中备查,避免往回翻的状态重复加入
- set1.insert(basicString);
- // 模拟,依次翻转后加入队列中
- for (int i = ; i < n - ; ++i) {
- string buff;
- buff.insert(, basicString);
- // 拷贝之后,翻转i和i+1两个位置的字符
- if (buff[i] == '*')
- buff[i] = 'o';
- else
- buff[i] = '*';
- if (buff[i + ] == 'o')
- buff[i + ] = '*';
- else
- buff[i + ] = 'o';
- // string s(buff);//字符数组转字符串
- if (set1.find(buff) == set1.end()) {
- stateAndLevel obj = {buff, front.level + };
- queue1.push(obj);
- }
- }
- // cout << queue1.size() << endl;
- }
- // cout << src << "\n" << target << endl;
- return ;
- }
- //解法2 规律解法
- #include <iostream>
- #include <queue>
- #include <set>
- using namespace std;
- int main(int argc, const char *argv[]) {
- string src;
- string target;
- getline(cin, src);
- getline(cin, target);
- int n = src.length();
- int ans=;
- int start=-;
- for (int i = ; i < n; ++i) {
- if(src[i]!=target[i]){
- if(start==-)//还没标记第一个位置
- {
- start=i;
- }else//第一个位置已经标记,现在已经找到了第二个位置
- {
- ans+=(i-start);
- start=-;
- }
- }
- }
- cout<<ans<<endl;
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-9标题:带分数
- 100 可以表示为带分数的形式:100 = 3 + 69258 / 714
- 还可以表示为:100 = 82 + 3546 / 197
- 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
- 类似这样的带分数,100 有 11 种表示法。
- 题目要求:
- 从标准输入读入一个正整数N (N<1000*1000)
- 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
- 注意:不要求输出每个表示,只统计有多少表示法!
- 例如:
- 用户输入:100
- 程序输出:11
- 再例如:
- 用户输入:105
- 程序输出:6
- 资源约定:
- 峰值内存消耗 < 64M
- CPU消耗 < 3000ms
- 请严格按要求输出,不要画蛇添足地打印类似:
- “请您输入...” 的多余内容。
- 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
- 注意: main函数需要返回0
- 注意: 只使用ANSI C/ANSI C++ 标准,
- 不要调用依赖于编译环境或操作系统的特殊函数。
- 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
- 不能通过工程设置而省略常用头文件。
- 提交时,注意选择所期望的编译器类型。
- ————————————————————————————————————————————————————————————*/
- //思路:生成1~9这9个数字的全排列,先在可能的位置插入+,
- //再在可能的位置插入/,验算等式,计数
- #include <iostream>
- #include <cstdlib>
- #include <algorithm>
- #include <string>
- using namespace std;
- int parse(const char *arr, int pos, int len) {
- int ans = ;
- int t = ;
- for (int i = pos + len - ; i >= pos; --i) {
- ans += (arr[i] - '') * t;
- t *= ;
- }
- return ans;
- }
- int main(int argc, const char *argv[]) {
- int n, ans = ;
- scanf("%d", &n);
- std::string s = ""; //全排列1到9
- do {
- const char *str = s.c_str();
- for (int i = ; i <= ; ++i) {//+号前的串的长度
- // string a = s.substr(0, i);
- int inta = parse(str, , i);
- if (inta >= n)break;
- for (int j = ; j <= - i - ; ++j) {//+/两个符号之间的串的长度
- // string b = s.substr(i, j);
- // string c = s.substr(i + j);//这是/后面的串
- // int intb = atoi(b.c_str());
- // int intc = atoi(c.c_str());
- int intb = parse(str, i, j);
- int intc = parse(str, i + j, - i - j);
- if (intb % intc == && inta + intb / intc == n)ans++;
- }
- }
- } while (std::next_permutation(s.begin(), s.end()));
- printf("%d\n", ans);
- return ;
- }
- /*———————————————————————————————————————————————————————————
- T-10标题:连号区间数
- 小明这些天一直在思考这样一个奇怪而有趣的问题:
- 在1~N的某个全排列中有多少个连号区间呢?
- 这里所说的连号区间的定义是:
- 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)
- 递增排序后能得到一个长度为R-L+1的“连续”数列,
- 则称这个区间连号区间。
- 当N很小的时候,小明可以很快地算出答案,
- 但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
- 输入格式:
- 第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
- 第二行是N个不同的数字Pi(1 <= Pi <= N),表示这N个数字的某一全排列。
- 输出格式:
- 输出一个整数,表示不同连号区间的数目。
- 示例:
- 用户输入:
- 4
- 3 2 4 1
- 程序应输出:7
- 用户输入:
- 5
- 3 4 2 5 1
- 程序应输出:9
- 解释:
- 第一个用例中,有7个连号区间分别是:[1,1], [1,2], [1,3], [1,4], [2,2], [3,3], [4,4]
- 第二个用例中,有9个连号区间分别是:[1,1], [1,2], [1,3], [1,4], [1,5], [2,2], [3,3], [4,4], [5,5]
- 资源约定:
- 峰值内存消耗 < 64M
- CPU消耗 < 5000ms
- 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
- 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
- 注意: main函数需要返回0
- 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
- 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
- 不能通过工程设置而省略常用头文件。
- 提交时,注意选择所期望的编译器类型。
- ————————————————————————————————————————————————————————————*/
- //C++
- #include <iostream>
- using namespace std;
- int n;
- int arr[];
- int ans;
- int main(int argc, const char *argv[])
- {
- scanf("%d", &n);
- for (int i = ; i < n; ++i)
- {
- scanf("%d", &arr[i]);
- }
- for (int j = ; j <= n - ; ++j)
- {
- int min=arr[j];
- int max = arr[j];
- for (int i = j; i <= n - ; ++i)
- {
- if(arr[i]>max)
- max=arr[i];
- if(arr[i]<min)
- min=arr[i];
- if (i == j)
- ans++;
- else {
- if(max-min+==i-j+)
- ans++;//j-i形成连号区间
- }
- }
- }
- printf("%d\n",ans);
- return ;
- }
- /**********************************************************
- * 【2013年省赛B组总结】
- 01【结果填空】高斯日记 手算/excel/编程(枚举,模拟翻日历) 第一天
- 02【结果填空】马虎的算式 枚举+check
- 03【结果填空】第39级台阶 普通走台阶的变体--递归思维
- 04【结果填空】 黄金连分数 黄金分割与斐波那契***
- 大数加法,大数除法(减法)
- n取多少,100位的小数才稳定呢
- 05【代码填空】前缀判断 c语言字符串处理,比对+偏移
- 06【代码填空】三部排序 快速排序的变体 单指针 双指针 三指针
- 07【代码填空】错误票据 排序+遍历
- 08【编程题】翻硬币 找规律*
- 09【编程题】 带分数 全排列+字符串的切割***
- 全排列+字符转整数——坑很大
- 10【编程题】 连号区间数 简单枚举
- ****************************************************************/
[蓝桥杯]2013蓝桥省赛B组题目及详解的更多相关文章
- [蓝桥杯]2017蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 (分值:5) 题目:购物单 小明刚刚找到工作,老板人很好 ...
- [蓝桥杯]2014蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小 ...
- [蓝桥杯]2016蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 (分值:3) 题目:煤球数目 有一堆煤球,堆成三角棱锥形 ...
- [蓝桥杯]2015蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:奖券数目 有些人很迷信数字,比如带“4”的数字,认 ...
- 2016年第七届蓝桥杯c/c++省赛B组
2016年第七届蓝桥杯c/c++省赛B组 声明:以下答案是我自己做的.不能保证正确,须要參考正确答案的请到其它地方找. 第一题 :煤球数目 题目叙述: 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个 ...
- 2019年第十届蓝桥杯【C++省赛B组】
试题 A: 组队 本题总分:5 分 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容.每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算首发阵容 ...
- 2017年第八届蓝桥杯【C++省赛B组】B、C、D、H 题解
可能因为我使用暴力思维比较少,这场感觉难度不低. B. 等差素数列 #暴力 #枚举 题意 类似:\(7,37,67,97,127,157\) 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列 ...
- 2017年第八届蓝桥杯【C++省赛B组】
1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有 ...
- 2018年第九届蓝桥杯【C++省赛B组】
2标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...
随机推荐
- Openresty编写Lua代码一例
1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...
- Vue.js-05:第五章 - 计算属性与监听器
一.前言 在 Vue 中,我们可以很方便的将数据使用插值表达式( Mustache 语法)的方式渲染到页面元素中,但是插值表达式的设计初衷是用于简单运算,即我们不应该对差值做过多的操作.当我们需要对差 ...
- org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.lang.Integer
如图: 详细错误信息如下: org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.l ...
- 微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源
美国当地时间12月4日,微软正式举行 Microsoft Connect(); 2018 开发者大会,本次大会的 slogan 是"Build the apps of tomorrow, t ...
- 企业级自动化运维工具---puppet详解
本文收录在Linux运维企业架构实战系列 1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. ...
- Flutter 即学即用系列博客——09 EventChannel 实现原生与 Flutter 通信(一)
前言 紧接着上一篇,这一篇我们讲一下原生怎么给 Flutter 发信号,即原生-> Flutter 还是通过 Flutter 官网的 Example 来讲解. 案例 接着上一次,这一次我们让原生 ...
- mybatis bug之org.apache.ibatis.exceptions.PersistenceException:
详细报错信息: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java. ...
- jqGrid 常用 总结 -1
这篇文章是因为,我们在做的后台项目,里面有大量的表格统计,这个不可能自己手写,所以其中的表格使用的是jqgrid. 这个插件其实使用起来还是不错的,里面有很多的功能很赞.这篇博客就是自己的的一个记录, ...
- Java基础小知识笔记
1. Integer转进制的一个类2. toBinaryString,toOctalString,toHexString.(转为二进制,八进制,十六进制的方法)3. 如果·数据的大小没有超过byte/ ...
- C# E店宝格格家接口对接
一.实现图片 二.实现通用方法 /// <summary> /// 调用通用方法 /// </summary> /// <param name="strURL& ...