|
<p>3.3皂皮书低级组模拟题 2<br /> 3.3.1 求和<br /> 输入一个正整数 N&#Vff08;1<N<20000&#Vff09;&#Vff0c;输出 1 到 N 之间所有正整数的和&#Vff08;包孕 1<br /> 和 N&#Vff09;。<br /> 输入形容&#Vff1a;输入一个正整数 N&#Vff08;1<N<20000&#Vff09;。<br /> 输出形容&#Vff1a;输出 1 到 N 之间所有正整数的和&#Vff08;包孕 1 和 N&#Vff09;。<br /> 【样例输入】3<br /> 【样例输出】6<br /> #include<iostream><br /> using namespace std;<br /> int main() {<br /> int n, i, sum = 0;<br /> cin >> n;<br /> for (i = 1; i <= n; i++) {<br /> sum = sum + i;<br /> }<br /> cout << sum;<br /> 第 92 页 共 256 页<br /> return 0;<br /> }<br /> 3.3.2 统计次数<br /> 输入一段英文&#Vff08;包孕字母和“.”&#Vff09;&#Vff0c;划分统计出那段英笔朱符串共有几多多个字符<br /> &#Vff08;包孕字母和“.”&#Vff09;及“.”显现的次数。<br /> 输入形容&#Vff1a;输入一段英笔朱符串&#Vff08;字符串长度<100&#Vff09;。<br /> 输出形容&#Vff1a;第一止输出字符总个数&#Vff1b;第二止输出“.”正在那段英笔朱符串中显现的次<br /> 数。<br /> 【样例输入】<br /> aaa. 【样例输出】<br /> 4<br /> 1<br /> 办法一、了解题目问题为 一段英文只包孕字母和“.”。<br /> #include<iostream><br /> #include<cstring><br /> using namespace std;<br /> int main() {<br /> string s;<br /> cin >> s; //不能完好读入带空格字符串<br /> int len, cnt = 0;<br /> len = s.size();<br /> for (int i = 0; i < len; i++) {<br /> if (s[i] == '.') {<br /> cnt++;<br /> }<br /> }<br /> cout << len << endl << cnt;<br /> return 0;<br /> }<br /> //办法二、思考输入内容不只仅包孕字母和“.”&#Vff1a;<br /> #include<iostream><br /> #include<cstring><br /> 第 93 页 共 256 页<br /> using namespace std;<br /> int main() {<br /> string s;<br /> getline(cin, s);<br /> int len, cnt1 = 0, cnt2 = 0;<br /> len = s.size();<br /> for (int i = 0; i < len; i++) {<br /> if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')) {<br /> cnt1++;<br /> }<br /> if (s[i] == '.') {<br /> cnt2++;<br /> }<br /> }<br /> cout << cnt1 + cnt2 << endl;<br /> cout << cnt2;<br /> return 0;<br /> }<br /> 3.3.3 牌序<br /> 间断输入 5 个正整数&#Vff08;0<正整数<1001&#Vff09;&#Vff0c;正整数之间以一个空格离隔&#Vff0c;而后<br /> 将那五个正整数依照从大到小的顺序输出&#Vff08;输出的正整数之间以一个英文逗号离隔&#Vff09;。<br /> 输入形容&#Vff1a;间断输入 5 个正整数&#Vff08;0<正整数<1001&#Vff09;划分以一个空格离隔。<br /> 输出形容&#Vff1a;依照从大到小的顺序输出且每个正整数之间用一个英文逗号离隔。<br /> 【样例输入】<br /> 3 2 5 5 4<br /> 【样例输出】<br /> 5,5,4,3,2<br /> #include<iostream><br /> #include<algorithm><br /> using namespace std;<br /> int main() {<br /> int a[5];<br /> for (int i = 0; i < 5; i++) {<br /> cin >> a[i];<br /> 第 94 页 共 256 页<br /> }<br /> sort(a, a + 5); //默许从小到大牌序<br /> cout << a[4]; //先输出第一个数前面没有分隔断绝结合符<br /> for (int i = 3; i >= 0; i--)<br /> cout << "," << a[i];<br /> return 0;<br /> }<br /> 3.3.4 最大折同数 最小公倍数<br /> 1、倍数取约数&#Vff1a;假如 a 能被 b 整除&#Vff0c;a 就叫作 b 的倍数&#Vff0c;b 就叫作 a 的约数。<br /> 约数和倍数都默示一个整数取另一个整数的干系&#Vff0c;不能径自存正在。<br /> 2、最大折同数&#Vff1a;几多个整数中公有的约数&#Vff0c;叫作那几多个数的折同数&#Vff1b;此中最大的一个&#Vff0c;<br /> 叫作那几多个数的最大折同数。举例&#Vff1a;12、16 的折同数有 1、2、4&#Vff0c;<br /> 此中最大的一个是 4&#Vff0c;所以 4 是 12 取 16 的最大折同数。<br /> 3、最小公倍数&#Vff1a;几多个作做数公有的倍数&#Vff0c;叫作那几多个数的公倍数&#Vff0c;此中最小的一个&#Vff0c;<br /> 叫作那几多个数的最小公倍数。举例&#Vff1a;4 的倍数有 4、8、12、16&#Vff0c;……&#Vff0c;<br /> 6 的倍数有 6、12、18、24&#Vff0c;……&#Vff0c;4 和 6 的公倍数有 12、24&#Vff0c;……&#Vff0c;此中最小的<br /> 是 12&#Vff0c;所以 4 和 6 最小公倍数为 12。<br /> 划分输入两个正整数&#Vff08;1<正整数<201&#Vff09;&#Vff0c;输出那两个正整数的最大折同数 M 及最<br /> 小公倍数 N&#Vff08;注&#Vff1a;M 和 N 输出到一止,之间以一个英文逗号离隔&#Vff09;。<br /> 输入形容&#Vff1a;第一止输入第一个正整数&#Vff1b;第二止输入第二个正整数。<br /> 输出形容&#Vff1a;输出那两个正整数的最大折同数 M 及最小公倍数 N&#Vff08;M 和 N 输出<br /> 到一止&#Vff0c;之间以一个英文逗号离隔&#Vff09;。<br /> 【样例输入】<br /> 4<br /> 6<br /> 【样例输出】<br /> 2,12<br /> 办法一&#Vff1a;先求最小公倍数<br /> #include <iostream><br /> #include <cmath><br /> using namespace std;<br /> int main() {<br /> int m, n, i = 1, gbc;<br /> cin >> m >> n;<br /> 第 95 页 共 256 页<br /> if (m < n)<br /> swap(m, n);<br /> while (m * i % n != 0) {<br /> i++;<br /> }<br /> gbc = m * i;<br /> cout << m*n / gbc << "," << gbc;<br /> //依据公式计较 最大折同数=两整数的乘积 ÷最小公倍数<br /> //留心要用括号扭转计较劣先级<br /> return 0;<br /> }<br /> 办法二&#Vff1a;辗转相除法 求最大折同<br /> #include<iostream><br /> using namespace std;<br /> int gys(int V, int y) { //辗转相除法<br /> if (y == 0) {<br /> return V;<br /> }<br /> return gys(y, V % y);<br /> }<br /> int main() {<br /> int n, m;<br /> cin >> n >> m;<br /> cout << gys(n, m) << ',' << n*m / a(n, m);<br /> return 0;<br /> }<br /> 3.4皂皮书中级组模拟题 2<br /> 3.4.1 求和<br /> 输入一个正整数 N&#Vff08;N<100&#Vff09;&#Vff0c;输出 1 到 N&#Vff08;包孕 1 和 N&#Vff09;之间所有奇数的<br /> 和。<br /> 输入形容&#Vff1a;输入一个正整数 N&#Vff08;N<100&#Vff09;。<br /> 输出形容&#Vff1a;输出 1 到 N 之间所有奇数的和。<br /> 第 96 页 共 256 页<br /> 【样例输入】<br /> 3<br /> 【样例输出】<br /> 4<br /> #include<iostream><br /> using namespace std;<br /> int main() {<br /> int n, i, sum = 0;<br /> cin >> n;<br /> for (i = 1; i <= n; i = i + 2) {<br /> sum = sum + i;<br /> }<br /> cout << sum;<br /> return 0;<br /> }<br /> 3.4.2 求平方<br /> 平方是一种运算&#Vff0c;比如&#Vff1a;a 的平方默示 a×a。<br /> 譬喻:2 的平方为 4&#Vff08;也便是 2*2 的积&#Vff09;。<br /> 譬喻:4 的平方为 16&#Vff08;也便是 4*4 的积&#Vff09;。<br /> 输入一个正整数 N&#Vff08;N<30&#Vff09;&#Vff0c;输出 1 到 N&#Vff08;包孕 1 和 N&#Vff09;之间所有正整数的平<br /> 方&#Vff0c;且所输出的平方数之间以英文逗号离隔。<br /> 输入形容&#Vff1a;输入一个正整数 N&#Vff08;N<30&#Vff09;。<br /> 输出形容&#Vff1a;输出 1 到 N 之间所有正整数的平方数&#Vff0c;且所输出的平方数之间以英文逗<br /> 号离隔。<br /> 【样例输入】<br /> 3<br /> 【样例输出】<br /> 1,4,9<br /> #include<iostream><br /> using namespace std;<br /> int main() {<br /> int i, n;<br /> cin >> n;<br /> for (i = 1; i <= n; i++)<br /> 第 97 页 共 256 页<br /> if (i == 1) cout << 1; //逗号的办理<br /> else cout << "," << i*i;<br /> return 0;<br /> }<br /> 3.4.3 数位递删数<br /> 一个正整数假如任何一个数位小于就是右边相邻的数位&#Vff0c;则称为一个数位递<br /> 删数。<br /> 譬喻&#Vff1a;<br /> 1135 是一个数位递删数。<br /> 1024 不是一个数位递删数。<br /> 输入一个正整数 n&#Vff08;10<n<10001&#Vff09;&#Vff0c;输出 10 到 n &#Vff08;包孕 10 和 n&#Vff09;中有几多多个<br /> 数位递删数。<br /> 输入形容&#Vff1a;输入一个正整数 n&#Vff08;10<n<10001&#Vff09;。<br /> 输出形容&#Vff1a;输出 10 到 n 中有几多多个数位递删数。<br /> 【样例输入】<br /> 15<br /> 【样例输出】<br /> 5<br /> 【上述输入输出样例的进一步评释】<br /> 用户输入的正整数&#Vff0c;即样例输入为 15&#Vff0c;10 到 15 之间的数位递删数有&#Vff1a;11、<br /> 12、13、14、15。所以样例输出为 5。<br /> #include<iostream><br /> using namespace std;<br /> int main() {<br /> int n, cnt = 0;<br /> int g, s, b, q;<br /> cin >> n;<br /> //10<n<10001 n 包孕 10000 但分比方乎条件 所以最大枚举 9999 四位数<br /> for (int i = 10; i <= n; i++) {<br /> g = i % 10;<br /> s = i / 10 % 10;<br /> b = i / 100 % 10; //两位数 b=0 不映响判断<br /> q = i / 1000 % 10;<br /> if (g >= s && s >= b && b >= q) {<br /> 第 98 页 共 256 页<br /> cnt++;<br /> }<br /> }<br /> cout << cnt;<br /> return 0;<br /> }<br /> 3.4.4 最短距离&#Vff08;蛇形填数&#Vff09;<br /> 有一个居民小区的楼房全是一样的&#Vff0c;并且按矩阵花式布列。其楼房的编号为<br /> 1&#Vff0c;2&#Vff0c;3...&#Vff0c;当牌满一止时&#Vff0c;从下一止相邻的楼往反标的目的牌号。<br /> 譬喻&#Vff1a;小区为 3 止 6 列&#Vff0c;矩阵布列方式&#Vff1a;<br /> 要求&#Vff1a;已知小区楼房有 w 列及两个楼房楼号 m 和 n&#Vff0c;求从 m 号楼到 n 号楼之<br /> 间的最短道路颠终几多个楼&#Vff08;不能斜线标的目的挪动&#Vff09;。<br /> 譬喻上图&#Vff1a;当 w=6&#Vff0c;m=8&#Vff0c;n=2&#Vff0c;从 8 号楼到 2 号楼最短的道路颠终 5&#Vff0c;4&#Vff0c;<br /> 3&#Vff0c;2 四个楼&#Vff08;9&#Vff0c;10&#Vff0c;11&#Vff0c;2 也颠终四个楼&#Vff09;&#Vff0c;故最短道路为 4&#Vff08;注&#Vff1a;不思考<br /> 道路只思考最短道路颠终几多个楼&#Vff09;。<br /> 输入三个正整数 w&#Vff08;1<w<21&#Vff09;&#Vff0c;m&#Vff08;1<m<10001&#Vff09;&#Vff0c;n&#Vff08;1<n<10001&#Vff09;&#Vff0c;且 m 不<br /> 就是 n。三个正整数之间以一个空格离隔&#Vff0c;输出 m 到 n 的最短道路颠终几多个<br /> 楼。<br /> 输入形容&#Vff1a;正在一止输入三个正整数 w&#Vff0c;m&#Vff0c;n&#Vff0c;三个正整数之间以一个空格隔<br /> 开。<br /> 输出形容&#Vff1a;输出 m 到 n 的最短道路颠终几多个楼。<br /> 【样例输入】<br /> 6 8 2<br /> 【样例输出】<br /> 4<br /> 第 99 页 共 256 页<br /> #include<iostream><br /> #include<algorithm><br /> #include<cmath><br /> #include<cstring><br /> using namespace std;<br /> int a[30][30];<br /> int main(){<br /> int w,m,n,s=1,V1,y1,V2,y2;<br /> cin>>w>>m>>n;<br /> for(int i=1;i<=w;i++){<br /> if(i%2!=0){<br /> for(int j=w;j>=1;j--){<br /> a[i][j]=s++;<br /> }<br /> }else{<br /> for(int j=0;j<w;j++){<br /> a[i][j]=s++;<br /> }<br /> }<br /> }<br /> for(int i=1;i<=w;i++){<br /> for(int j=1;j<=w;j++){<br /> if(a[i][j]==m){<br /> 第 100 页 共 256 页<br /> V1=i;<br /> y1=j;<br /> }<br /> if(a[i][j]==n){<br /> V2=i;<br /> y2=j;<br /> }<br /> }<br /> }<br /> cout<<abs((V1+y1)-(y1+y2))+1;<br /> return 0;<br /> }<br /> #include<bits/stdc++.h><br /> using namespace std; //6 20 80<br /> int main() {<br /> int w,m,n,k=1,L;<br /> int i,j,i1=0,j1=0,i2=0,j2=0;<br /> cin >> w>>m>>n;<br /> L=maV(m,n)/w+1;<br /> int a[w+1][L+1]={};<br /> for(i=1;i<=L;i++){<br /> for(j=1;j<=w;j++){<br /> if(i%2==1){<br /> 第 101 页 共 256 页<br /> a[i][j]=(i-1)*6+j;<br /> }<br /> else<br /> {<br /> a[i][j]=i*6+1-j;<br /> }<br /> }<br /> }<br /> for(i=1;i<=L;i++){<br /> for(j=1;j<=w;j++){<br /> if(a[i][j]==m){<br /> i1=i;j1=j;<br /> }<br /> if(a[i][j]==n){<br /> i2=i;j2=j;<br /> }<br /> }<br /> }<br /> cout<< i1<<" "<<j1<<endl;<br /> cout<< i2<<" "<<j2<<endl;<br /> cout<<abs(i2-i1)+abs(j2-j1);<br /> return 0;<br /> }<br /> 第 102 页 共 256 页<br /> 3.4.5 组折<br /> 输入两个正整数 m 和 n&#Vff08;20≥m≥n>0&#Vff09;&#Vff0c;要求 m 个正整数相加的和为 n&#Vff0c;输出<br /> 满足那个条件的正整数组折有几多多。<br /> 输入形容&#Vff1a;分止输入 m 和 n&#Vff08;20≥m≥n>0&#Vff09;。<br /> 输出形容&#Vff1a;输出满足那个条件的正整数组折有几多多。<br /> 【样例输入】<br /> 4<br /> 8<br /> 【样例输出】<br /> 5<br /> 【上述输入输出样例的进一步评释】<br /> 用户输入的两个正整数&#Vff0c;即样例输入为 4 和 8&#Vff0c;满足条件的有&#Vff1a;5+1+1+1=8、<br /> 4+2+1+1=8、3+3+1+1=8、3+2+2+1=8、2+2+2+2=8&#Vff08;每组组折都由 4 个正整数<br /> 构成且 4 个正整数的和就是 8&#Vff09;所以样例输出为 5。<br /> #include <iostream><br /> using namespace std;<br /> int a[10001]={1},m,n,total;<br /> int search(int s,int t){<br /> int i;<br /> for(i=a[t-1];i<=s;i++){<br /> if(i<=m){<br /> a[t]=i;<br /> s-=i;<br /> if(s==0&&t==n){<br /> total++;<br /> }<br /> 第 103 页 共 256 页<br /> else{<br /> search(s,t+1);<br /> }<br /> s+=i;<br /> }<br /> }<br /> }<br /> int main(){<br /> cin>>n>>m;<br /> search(m,1);<br /> cout<<total;<br /> return 0;<br /> }<br /> 第 104 页 共 256 页<br /> 3.5***第十届蓝桥青少组省赛 C++高级组<br /> 3.5.1 水下探测器<br /> 水下探测器可以潜入湖中正在任意水深停行科学摸索。<br /> 湖水的最大深度为 h 米,即它正在湖底时到水面的距离&#Vff0c;0<=h<=100&#Vff1b;<br /> 探测器最初的水下深度为 s 米&#Vff0c;0<=s<=100&#Vff1b;<br /> 当探测器不正在水面&#Vff08;当前深度大于 0&#Vff09;时&#Vff0c;每个 u 指令可使它上浮 1 米&#Vff0c;而当<br /> 探测器正在水面时&#Vff0c;u 指令是无效的&#Vff1b;<br /> 当探测器不正在湖底&#Vff08;当前深度小于 h&#Vff09;时&#Vff0c;每个 d 指令可使它下沉 1 米&#Vff0c;而当<br /> 探测器正在湖底时&#Vff0c;d 指令是无效的&#Vff1b;<br /> 正在执止到无效指令时&#Vff0c;探测器不作任何收配而继续执止下一指令。<br /> 编程真现&#Vff1a;<br /> 依据给定的 h、s 和一个指令序列&#Vff08;由字符 u、d 构成的字符串&#Vff0c;长度不赶过 100&#Vff09;&#Vff0c;<br /> 求出执止完好的指令序列后&#Vff0c;探测器的水下深度。<br /> 输入&#Vff1a;<br /> 第一止&#Vff1a;h 和 s&#Vff0c;以空格离开。0<=s<=h<=100<br /> 第二止&#Vff1a;长度不赶过 100 的指令字符串&#Vff0c;串中仅包孕字母 u 或 d<br /> 输出&#Vff1a;<br /> 代表探测器正在执止指令后的水下深度的数字。<br /> 样例输入&#Vff1a;<br /> 9 1<br /> uduudd<br /> 样例输出&#Vff1a;<br /> 2<br /> 考查知识:<br /> 根原语法,字符串,循环,条件判断<br /> #include <iostream><br /> using namespace std;<br /> int main(){<br /> int h,s;<br /> string str;<br /> cin>>h>>s>>str;<br /> for(int i=0;i<str.size();i++){<br /> 第 105 页 共 256 页<br /> if(str[i]=='u'&&s>0) s--;<br /> if(str[i]=='d'&&s<h) s++;<br /> }<br /> cout<<s;<br /> }<br /> 3.5.2 小猫吃鱼<br /> 明明家从 1 号站点动身&#Vff0c;开车去旅游&#Vff0c;一共要颠终 n 个站点&#Vff0c;挨次为 2、3……n。<br /> 由于明明带上了可爱的小猫&#Vff0c;正在每个站点都要为小猫供给一条鱼用作美餐&#Vff08;蕴含 1<br /> 号站点&#Vff09;。<br /> 除了 1 号站点只能吃 1 号站点买的鱼&#Vff0c;其余站点既可以吃当地买的鱼&#Vff0c;也可吃<br /> 之前颠终的站点买了存入车载冰箱中的鱼。但车载冰箱泯灭的电能来自汽油&#Vff0c;所以每<br /> 条鱼用冰箱保存到下一站的用度取各个站点的汽油价格有关。<br /> 为使问题简化&#Vff0c;咱们约定&#Vff1a;<br /> &#Vff08;1&#Vff09;车从某站开出时油箱中都是此站点刚加的汽油。<br /> &#Vff08;2&#Vff09;车载冰箱能包容一路上须要的所有鱼。 即&#Vff1a;每条鱼的用度既蕴含置办时的<br /> 用度&#Vff0c;也蕴含用冰箱保存鱼的用度。<br /> 编程真现&#Vff1a;<br /> 为了降低小猫吃鱼的总价钱&#Vff0c;明明预先上网查到了那 n 个站点的鱼价和汽油价<br /> 格。并据此算出每个站点买一条鱼的用度以及从该站点到下一站用冰箱保存一条鱼的<br /> 用度。你能帮明明算出那一路上小猫吃鱼的最小总用度吗&#Vff1f;<br /> 输入&#Vff1a;<br /> 第一止&#Vff1a;站点数 n&#Vff0c;1<n<100。<br /> 接下来的 n 止&#Vff1a;每止两个以空格分隔断绝结合的正整数&#Vff0c;默示&#Vff1a;那一站买一条鱼的用度&#Vff0c;<br /> 以及从那一站把每条<br /> 鱼保存到下一站的用度&#Vff0c;两个用度均为小于 10000 的正整数。<br /> 输出&#Vff1a;<br /> 最小总用度&#Vff0c;是一个正整数。<br /> 样例输入&#Vff1a;<br /> 5<br /> 6 3<br /> 7 1<br /> 3 2<br /> 8 3<br /> 9 5<br /> 样例输出&#Vff1a;<br /> 第 106 页 共 256 页<br /> 29<br /> 运用 for 循环&#Vff0c;每次看看代价是不是最划算&#Vff0c;不是就加上一条鱼&#Vff0c;是也要加上那<br /> 一条鱼&#Vff0c;每次还要加上保存的代价。<br /> #include <iostream><br /> using namespace std;<br /> int main() {<br /> int n;<br /> cin>>n;<br /> int m1[n], m2[n];<br /> for(int i = 0; i < n; i++)<br /> cin>>m1[i]>>m2[i];<br /> //输入当前买鱼的钱和保存的钱<br /> int min = 9999999, t = 0;<br /> for(int i = 0; i < n; i++) {<br /> if(min > m1[i])<br /> min = m1[i];<br /> t = t + min; //上一条鱼<br /> min = min + m2[i]; //保存<br /> }<br /> cout<<t<<endl;<br /> return 0;<br /> }<br /> 3.5.3 评比最佳品排<br /> n 个评卫投票&#Vff0c;正在 m 个商品中评比一个最佳品排。<br /> 评比给取多轮套汰制&#Vff0c;即&#Vff1a;每轮投票&#Vff0c;套汰掉得票起码的候选品排&#Vff08;得票并列最<br /> 少的品排一起套汰&#Vff09;。<br /> 如此一轮轮套汰下去&#Vff0c;假如最后只剩下一个品排中选&#Vff0c;即告评比乐成。<br /> 但假如正在某轮投票中&#Vff0c;其时未被套汰的所有候选品排&#Vff08;大于就是两个品排&#Vff09;都并<br /> 列得票起码&#Vff0c;即告评比失败。<br /> 假如评比乐成绩输出中选品排号。否则输出最后一轮评比时惟一选票数的相反数。<br /> 正在评比流程中&#Vff0c;每个评卫的态度都可用一个序列来默示&#Vff1b;譬喻当 m=5 时&#Vff0c;某评<br /> 卫的评比态度序列为&#Vff1a;3、<br /> 5、1、2、4&#Vff0c;则默示该评卫&#Vff1a;劣先投 3 号&#Vff0c;当 3 号被套汰时投 5 号&#Vff0c;当 3 和 5<br /> 都被套汰时投 1&#Vff0c;当 3、5、1 都被套汰时投 2&#Vff0c;仅剩 4 号时才投 4 号品排的票。<br /> 选票的序列中可以默示弃权&#Vff0c;用 0 来默示&#Vff0c;譬喻当 m=5 时&#Vff0c;某评卫的评比态度<br /> 序列为&#Vff1a;3、5、0&#Vff0c;则默示该评卫&#Vff1a;劣先投 3 号&#Vff0c;当 3 号被套汰时投 5 号&#Vff0c;其他情<br /> 第 107 页 共 256 页<br /> 况下不投任何品排的票。<br /> 编程真现&#Vff1a;<br /> 请你编一个步调&#Vff0c;模拟各轮投票的历程&#Vff0c;获得评比结果。<br /> 输入&#Vff1a;<br /> 第一止&#Vff1a;m(0<m<10,默示加入评比的品排数)和 N(1<n<1000,默示加入投票的评卫<br /> 数)&#Vff0c;之间以空格分隔断绝结合接下来的 n 止&#Vff1a;每止都是长度不超 m 的数字字符串&#Vff0c;每个字<br /> 符串默示一个评卫的评比态度。<br /> 输出&#Vff1a;<br /> 评比结果。<br /> 样例 1 输入&#Vff1a;<br /> 3 4<br /> 123<br /> 213<br /> 132<br /> 10<br /> 样例 1 输出&#Vff1a;<br /> 1<br /> 样例 2 输入&#Vff1a;<br /> 3 4<br /> 321<br /> 213<br /> 231<br /> 312<br /> 样例 2 输出&#Vff1a;<br /> -2<br /> 样例数据阐明:<br /> 样例 1:<br /> 第一止 3 4 代表 3 个品排,4 个评卫<br /> 第一轮投票,3 个评卫劣先选择 1 号品排,1 个评卫选择 2 号品排,品排 3 得票起码, 套汰掉<br /> 第二轮投票,3 个评卫劣先选择 1 号品排,1 个评卫选择 2 号品排,品排 2 得票起码, 套汰掉,套汰 2 号品排后,只剩一个 1 号品排,1 号品排胜出&#Vff0c;最末结果 1<br /> 样例 2:<br /> 第一止 3 4 代表 3 个品排,4 个评卫<br /> 第一轮投票,2 个评卫选择 2 号品排,两个评卫选择 3 号品排,1 号得票起码,套汰掉<br /> 第二轮投票,2 个评卫选择 2 号品排,两个评卫选择 3 号品排,由于只剩下两个品排,<br /> 第 108 页 共 256 页<br /> 且并列起码,都是 2 票,代表评比失败,须要输出最后一轮票数 2 的相反数-2<br /> 最末结果 -2<br /> 考查知识:<br /> 字符串,桶牌序,模拟算法<br /> #include <iostream><br /> using namespace std;<br /> int main(){<br /> int m,n;<br /> cin>>m>>n;<br /> string str[n+1];<br /> for(int i=1;i<=n;i++){<br /> cin>>str[i];<br /> }<br /> int a[m+1];//记录投票历程,-1 代表套汰<br /> while(true){<br /> for(int i=1;i<=m;i++){<br /> //从头计票,所有没有被套汰的票数归零<br /> if(a[i]!=-1)a[i]=0;<br /> }<br /> for(int i=1;i<=n;i++){<br /> //计票<br /> string s=str[i];<br /> for(int j=0;j<s.size();j++){<br /> char t=s[j]-'0';<br /> if(t==0){<br /> //假如为 0 注明弃权<br /> break;<br /> }else{<br /> //不为 0,则代表要给 t 投票,假如 t 没有被套汰则给它投票<br /> if(a[t]>=0){<br /> a[t]=a[t]+1;<br /> break;<br /> }<br /> }<br /> }<br /> }<br /> 第 109 页 共 256 页<br /> int min=m+1;<br /> int maV=0;<br /> for(int i=1;i<=m;i++){<br /> if(a[i]>=0){<br /> if(min>a[i]) min=a[i];<br /> if(maV<a[i])maV=a[i];<br /> }<br /> }<br /> if(maV>min){<br /> //最大值比最小值大,须要将所有最小值的套汰<br /> for(int i=1;i<=m;i++){<br /> if(a[i]==min)a[i]=-1;<br /> }<br /> }else{<br /> //最大值和最小值相等注明平票<br /> int count=0;<br /> int dV=0;<br /> for(int i=1;i<=m;i++){<br /> if(a[i]==maV){<br /> count++;<br /> dV=i;<br /> }<br /> }<br /> if(count>1){<br /> //假如数质多,注明评比失败<br /> cout<<0-maV;<br /> }else{<br /> cout<<dV;<br /> }<br /> break;<br /> }<br /> }<br /> cin>>m;<br /> }<br /> 第 110 页 共 256 页<br /> 3.5.4 蓝桥杯赛迷宫<br /> 把一个 n 止 m 列的字符阵列看作一个迷宫&#Vff0c;迷宫仅包孕 L、Q、B、S 中的大<br /> 写字母&#Vff08;蓝桥杯赛的汉语拼音首字母&#Vff09;。<br /> 初始时&#Vff0c;你可以从任意一个“L”字母初步&#Vff0c;移向相邻的“Q”字母&#Vff0c;而后今后“Q”字<br /> 母动身&#Vff0c;移向相邻的“B”字母&#Vff0c;而后今后“B”字母动身&#Vff0c;移向相邻的“S”字母……。那<br /> 样&#Vff0c;你就算是走过了一个“LQBS”字符序列。<br /> 接下来&#Vff0c;依然可以今后“S”字母动身&#Vff0c;移向相邻的“L”字母……&#Vff0c;重复上述的止动&#Vff0c;<br /> 你就可以不停地走过“LQBS”序列。<br /> 请留心&#Vff0c;所谓相邻仅包孕上、下、右、左 4 个标的目的&#Vff0c;且只能从 L->Q&#Vff0c;从 Q->B&#Vff0c;<br /> 从 B->S&#Vff0c;从 S->L。<br /> 可以想像&#Vff0c;由于选择的动身点差异&#Vff0c;咱们有可能正在迷宫中走过有数次的“LQBS”&#Vff0c;<br /> 大概是有限次的“LQBS”&#Vff0c;<br /> 大概一次也走不了。<br /> 编程真现&#Vff1a;<br /> 请你编写步调&#Vff0c;求出正在给定的迷宫中&#Vff0c;咱们最多可以走过几多屡次“LQBS”?<br /> 输入&#Vff1a;<br /> 第一止&#Vff1a;正整数 n,m&#Vff0c;默示迷宫的范围为 n 止 m 列&#Vff0c;0<m<100&#Vff0c;0<n<100<br /> 接下来的 n 止&#Vff1a;每止 m 个折乎题意的字母&#Vff0c;字母间无空格。<br /> 输出&#Vff1a;<br /> 一个整数。即&#Vff1a;假如正在迷宫中可以无限次的走过“LQBS”&#Vff0c;输出-1&#Vff0c;否则&#Vff0c;输出可<br /> 以走过“LQBS”的最多次数。<br /> 样例 1 输入&#Vff1a;<br /> 1 2<br /> LQ<br /> 样例 1 输出&#Vff1a;<br /> 0<br /> 样例 2 输入&#Vff1a;<br /> 3 3<br /> LSB<br /> QBQ<br /> BSL<br /> 样例 2 输出&#Vff1a;<br /> -1<br /> 样例 3 输入&#Vff1a;<br /> 4 4<br /> 第 111 页 共 256 页<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 样例 3 输出&#Vff1a;<br /> 2<br /> 样例数据阐明:<br /> 样例 1:<br /> 第一止数据 3 3 代表是 3 止 3 列的迷宫<br /> 第 1 步,寻找 L<br /> LSB<br /> QBQ<br /> BSL<br /> 第 2 步,正在 L 的高下摆布寻找 Q<br /> LSB<br /> QBQ<br /> BSL<br /> 第 3 步,正在 Q 的高下摆布寻找 B<br /> LSB<br /> QBQ<br /> BSL<br /> 第 4 步,正在 B 的高下摆布寻找 S<br /> LSB<br /> QBQ<br /> BSL<br /> 如此当重复到 10 次的时候,仍可以继续走,代表进入无限循环<br /> 因为 3 止 3 列最多 9 个格子,能走 10 步就代表一定进入无限循环<br /> 输出-1<br /> 样例 2:<br /> 第一止数据 4 4 代表是 4 止 4 列的迷宫<br /> 第 1 步,寻找末点 L<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 2 步,正在 L 的高下摆布寻找 Q<br /> 第 112 页 共 256 页<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 3 步,正在 Q 的高下摆布寻找 B<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 4 步,正在 B 的高下摆布寻找 S<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 5 步,正在 S 的高下摆布寻找 L<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 6 步,正在 L 的高下摆布寻找 Q<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 7 步,正在 Q 的高下摆布寻找 B<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 8 步,正在 B 的高下摆布寻找 S<br /> BLQB<br /> BBQS<br /> SBQL<br /> QQQQ<br /> 第 9 步,正在 S 的高下摆布寻找 L<br /> 因为找不到 L 了,则代表迷宫走到止境,一共走了 8 步,LQBS 一共 4 个字符,所以走<br /> 第 113 页 共 256 页<br /> 了<br /> 8/4=2 共计 2 次 LQBS,输出 2<br /> 考查知识:<br /> 搜寻取回朔<br /> 未学到搜寻取回朔算法,可以给取循环遍历类似穷举算法停行题解<br /> #include<iostream><br /> using namespace std;<br /> int main(){<br /> int n,m;<br /> cin>>n>>m;<br /> char map[n+1][m+1];<br /> int path[n+1][m+1];<br /> for(int i=1;i<=n;i++){<br /> string s;<br /> cin>>s;<br /> for(int j=1;j<=m;j++){<br /> map[i][j]=s[j-1];<br /> path[i][j]=0;<br /> if(map[i][j]=='L'){<br /> path[i][j]=1;<br /> }<br /> }<br /> }<br /> string LQBS="LQBS";<br /> int now=1;<br /> while(true){<br /> int flag=0;<br /> for(int i=1;i<=n;i++){<br /> for(int j=1;j<=m;j++){<br /> if(path[i][j]==now){<br /> if(map[i][j-1]==LQBS[now%4]){<br /> path[i][j-1]=now+1;<br /> flag++;<br /> }<br /> if(map[i][j+1]==LQBS[now%4]){<br /> 第 114 页 共 256 页<br /> path[i][j+1]=now+1;<br /> flag++;<br /> }<br /> if(map[i-1][j]==LQBS[now%4]){<br /> path[i-1][j]=now+1;<br /> flag++;<br /> }<br /> if(map[i+1][j]==LQBS[now%4]){<br /> path[i+1][j]=now+1;<br /> flag++;<br /> }<br /> }<br /> }<br /> }<br /> /*for(int i=1;i<=n;i++){<br /> for(int j=1;j<=m;j++){<br /> cout<<path[i][j]<<" ";<br /> }<br /> cout<<endl;<br /> }<br /> cout<<endl;*/<br /> if(flag==0){<br /> break;<br /> }<br /> if(now>(n+1)*(m+1)){<br /> break;<br /> }<br /> now++;<br /> }<br /> if(now>(n+1)*(m+1)){<br /> cout<<-1;<br /> }else{<br /> cout<<now/4;<br /> }<br /> cin>>n;<br /> }<br /> 第 115 页 共 256 页<br /> 3.5.5 最大购物劣惠<br /> 小惠风闻超市正正在打合促销&#Vff0c;要制定一个获得最大劣惠的购物筹划。<br /> 小惠的体力可以提起 w 单位分质的东西&#Vff0c;另有一个能拆 x 个单位体积的购物<br /> 袋&#Vff0c;并具体理解了各打合商品的分质、体积及此商品真际劣惠的金额。她想正在原人体<br /> 力的限度和购物袋容积限度内&#Vff0c;尽可能多地获得购物劣惠。<br /> 超市规定那些打合商品每种只能置办一件。<br /> 编程真现&#Vff1a;<br /> 请你编写步调&#Vff0c;制订一个置办商品的筹划&#Vff0c;求出小惠能获得的最大劣惠金额和真<br /> 际应置办的各商品序号。<br /> 输入&#Vff1a;<br /> 第一止&#Vff1a;挨次为 w、ZZZ 和 n(n 为商品品种数)&#Vff0c;所无数值均为不赶过 100 的正整<br /> 数 接下来的 n 止&#Vff1a;每止有三个整数&#Vff0c;挨次为某种商品的分质、体积和让利金额&#Vff0c;数<br /> 值间以空格离开&#Vff0c;所无数值均为不赶过 100 的正整数<br /> 输出&#Vff1a;<br /> 第一止&#Vff1a;小惠能够获得的最大让利金额<br /> 第二止&#Vff1a;挨次为从小到大布列的商品序号&#Vff0c;序号从 1 初步&#Vff0c;序号间用空格离开。<br /> 若第二止输出的序列<br /> 不惟一&#Vff0c;则输出其最小字典序。<br /> 样例输入&#Vff1a;<br /> 10 9 4<br /> 8 3 6<br /> 5 4 5<br /> 3 7 7<br /> 4 5 4<br /> 样例输出&#Vff1a;<br /> 9<br /> 2 4<br /> 考查知识:<br /> 动态布局&#Vff0c;二维用度的背包问题&#Vff0c;正在 01 背包问题的根原上删多一个用度维度<br /> 形态转移方程&#Vff1a;<br /> yh[i][j][k]=maV(yh[i-1][j][k],yh[i-1][j-w[i]][k-ZZZ[i]]+n[i])<br /> 规范 01 背包问题解<br /> 第 116 页 共 256 页<br /> #include <iostream><br /> using namespace std;<br /> int main() {<br /> int w, ZZZ, n;<br /> cin >> w >> ZZZ >> n;<br /> int a[n + 1], b[n + 1], c[n + 1];<br /> int yh[n + 1][w + 1][ZZZ + 1];<br /> string s[n + 1][w + 1][ZZZ + 1];<br /> for (int i = 1; i <= n; i++)<br /> cin >> a[i] >> b[i] >> c[i];<br /> for (int i = 0; i <= n; i++) {<br /> for (int j = 0; j <= w; j++) {<br /> for (int k = 0; k <= ZZZ; k++) {<br /> yh[i][j][k] = 0;<br /> s[i][j][k] = "";<br /> }<br /> }<br /> }<br /> for (int i = 1; i <= n; i++) {<br /> for (int j = 1; j <= w; j++) {<br /> for (int k = 1; k <= ZZZ; k++) {<br /> int bn = yh[i - 1][j][k];<br /> int n = 0;<br /> if (j >= a[i] && k >= b[i]) { //分质和体积够,拿当前物品<br /> n = yh[i - 1][j - a[i]][k - b[i]] + c[i];<br /> }<br /> if (n > bn) { //假如拿了比不拿价值大,就拿那个物品<br /> yh[i][j][k] = n;<br /> //同时记录拿了那个物品<br /> s[i][j][k] = s[i - 1][j - a[i]][k - b[i]] + " " + (char)(i + '0');<br /> } else {<br /> //否则记录当前分质和体积的最劣战略是不拿<br /> yh[i][j][k] = bn;<br /> //同时记录不拿当前物品,保持和之前一样的物品列表<br /> s[i][j][k] = s[i - 1][j][k];<br /> 第 117 页 共 256 页<br /> }<br /> }<br /> }<br /> }<br /> cout << yh[n][w][ZZZ] << endl;<br /> string str = s[n][w][ZZZ];<br /> cout << str.substr(1, str.size() - 1);<br /> }<br /> 3.5.6 购物单<br /> XX 大促销又来了&#Vff0c;长长的购物单&#Vff0c;都是有打合劣惠的。<br /> 请你帮他计较一下&#Vff0c;须要从与款机上与几多多现金&#Vff0c;威力搞定此次购物。<br /> 与款机只能供给 100 元面额的纸币。小明想尽可能少与些现金&#Vff0c;够用就止了。<br /> 你的任务是计较出&#Vff0c;小明起码须要与几多多现金。<br /> 180.90 88 合<br /> 10.25 65 合<br /> 56.14 9 合<br /> 104.65 9 合<br /> 100.30 88 合<br /> 297.15 半价<br /> 26.75 65 合<br /> 130.62 半价<br /> #include<iostream><br /> using namespace std;<br /> int main()<br /> {<br /> double j,z,sum=0;//本价 合扣<br /> for(int i=1; i<=8; i++) {<br /> cin>>j>>z;<br /> sum=sum+j*z;<br /> }<br /> sum=sum+0.9; //零钱局部舍入 正确到 1 角<br /> if(int(sum)%100>0)//不是 100 元的整数倍<br /> cout<<int(sum)/100*100+100;<br /> else<br /> cout<<int(sum);<br /> 第 118 页 共 256 页<br /> return 0;<br /> }<br /> 3.5.7 等差素数列<br /> 2,3,5,7,11,13,....是素数序列。类似&#Vff1a;7,37,67,97,127,157 那样彻底由素数构成的等差数列&#Vff0c;叫<br /> 等差素数数列。上边的数列公差为 30&#Vff0c;长度为 6。<br /> 2004 年&#Vff0c;格林取华人陶哲轩竞争证真了&#Vff1a;存正在任意长度的素数等差数列。<br /> 那是数论规模一项惊人的成绩&#Vff01;有那一真践为根原&#Vff0c;请你借助手中的计较机&#Vff0c;满<br /> 怀自信心地搜寻&#Vff1a;<br /> 长度为 10 的等差素数列&#Vff0c;其公差最小值是几多多&#Vff1f;<br /> 留心&#Vff1a;须要提交的是一个整数&#Vff0c;不要填写任何多余的内容和注明笔朱。<br /> 先用埃氏筛法&#Vff0c;把 1~N (N 先设置一个 10000 吧&#Vff0c;不够再加)以内的素数都挑选出<br /> 来&#Vff0c;而后再枚举 1~10000(公差&#Vff0c;不够再加)&#Vff0c;寻找间断 10 个的素数。<br /> #include <iostream><br /> using namespace std;<br /> const int maVn = 10000000;<br /> int prime[maVn];<br /> bool is_prime[maVn + 10]; //is_prime[i]为 true 默示 i 是素数<br /> bool is_Prime(int n)<br /> {<br /> int i = 0;<br /> for (i = 2; i * i <= n; i++)<br /> {<br /> if (n % i == 0) return false;<br /> }<br /> return n != 1;<br /> }<br /> //返回 n 以内的素数<br /> int sieZZZe(int n)<br /> {<br /> int p = 0;<br /> //初始化<br /> for (int i = 0; i <= n; i++) {<br /> is_prime[i] = true;<br /> }<br /> is_prime[0] = is_prime[1] = false;<br /> 第 119 页 共 256 页<br /> for (int i = 0; i <= n; i++)<br /> {<br /> if (is_prime[i])<br /> {<br /> prime[p++] = i; //将素数添加到 prime 中<br /> //1.首先 2 是素数, 而后划去所有 2 的倍数<br /> //2.表中剩余的最小数字是 3, 他不能被更小的数整除,所以是素数<br /> //再将表中所有 3 的倍数都划去<br /> //3.以此类推, 假如表中剩余的最小数字是 m 时,m 便是素数。而后将表<br /> 中所有 m 的倍数都划去<br /> for (int j = 2 * i; j <= n; j += i) {<br /> is_prime[j] = false;<br /> }<br /> }<br /> }<br /> return p;<br /> }<br /> ZZZoid solZZZe(){<br /> int N = 10000;<br /> int cnt = sieZZZe(N);<br /> //公差<br /> for (int d = 10; d < N; d++){<br /> //枚举 N 以内所有素数<br /> for (int i = 0; i < cnt; i++){<br /> int tmp = prime[i],<br /> flag = true;<br /> //能否间断 10 个都为素数<br /> for (int j = 0; j < 9; j++)<br /> {<br /> if (tmp + d > N || !is_Prime(tmp + d))<br /> {<br /> flag = false;<br /> 第 120 页 共 256 页<br /> break;<br /> }<br /> else<br /> {<br /> tmp += d; //下一个素数<br /> }<br /> }<br /> if (flag) {<br /> cout << d << " " << prime[i] << endl;<br /> return;<br /> }<br /> }<br /> }<br /> }<br /> int main()<br /> {<br /> solZZZe();<br /> return 0;<br /> }</p>
|