今天打中石的新生训练
是很多年前小学生做的题
数据范围很友好不用怎么考虑T
但成绩不大理想
知耻后勇吧 小代加油
问题 A: 包裹托运
题目描述
春节快到了,小红和爸爸一起来到邮局,打算给家住外地的爷爷、奶奶家里捎点年货。邮局的阿姨介绍,托运包裹的运费标准是:包裹重量不大于15公斤时,每公斤6元;超过15公斤后,其超过部分每公斤9元;现已知:包裹的重量为X公斤,请同学们和小红一起帮助邮局的阿姨计算一下,包裹的运费Y应为多少元?
输入
只有一行,包含一个数值X(其中1≤X≤100)表示包裹的重量,单位:公斤。
输出
只有一行,包含1个整数,表示包裹的运费(要求四舍五入保留整数),单位:元。
样例输入 Copy
11.6
样例输出 Copy
70
很简单的一道题 印象很深 我用math.h里面的ceil函数就是不让过
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using
namespace
std;
int
main()
{
ios::sync_with_stdio(
false
),cin.tie(NULL);
double
x;
double
y;
cin>>x;
if
(x <= 15)
{
y = x * 6;
}
else
{
y = (x - 15) * 9 + 15 * 6;
}
int
ans = (
int
)y;
if
((
int
)(y + 0.5) > (
int
)y)
{
ans++;
}
cout<<ans<<endl;
return
0;
}
/**************************************************************
Problem: 10356
User: 2020SWUN07
Language: C++
Result: 正确
Time:1 ms
Memory:2180 kb
****************************************************************
问题 B: 字母图形
题目描述
由键盘输入任意的一个由大写字母组成的字符串(不需检验是否为大写字母),要求以字符串的长度L作为图形的行数,并将输入的这个字符串作为图形的第一行进行打印输出。从第二行开始,图形的特点是:将第一行的最后两个字符整体移到最前就是第二行,再把第二行的最后两个字符整体移到最前就是第三行,……依次进行,完成L行字母的输出。例如:输入字符串“ABCDE”, 按照上述移动的规则,最后输出的图形如下列样例输出图形所示。
输入
只有一个由大写字母组成的字符串,字符串的长度为L(其中3≤L≤26)。
输出
输出对应的图形。
样例输入 Copy
ABCDE
样例输出 Copy
ABCDE DEABC BCDEA EABCD CDEAB
水题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
string s;
cin>>s;
cout<<s<<endl;
int n = s.size();
char a,b;
for(int i = 1; i <= n - 1; i++)
{
a = s[n - 2];
b = s[n - 1];
for(int j = n - 1; j >= 2; j--)
{
s[j] = s[j - 2];
}
s[0] = a;
s[1] = b;
cout<<s<<endl;
}
return 0;
}
问题 C: 海淀字符串
题目描述
从键盘输入一个由大、小写字母和数字组成的任意一个字符串(不需判断),其长度不小于8,不大于30。现要求将字符串中的所有数字字符删除,其他字符依照原有顺序保持不变,并统计删除的数字的个数。
输入
只有一行,包含只由大、小写字母和数字组成的一个字符串(其长度8≤L≤30)。
输出
共有两行:
第一行:为删除数字字符后的字符串;
第二行:为统计删除的数字的个数。
样例输入 Copy
ABCD123efg678
样例输出 Copy
ABCDefg 6
水题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
string s;
cin>>s;
bool v[35] = {0};
int n = s.size();
int vis = 0;
for(int i = 0; i <= n - 1; i++)
{
if(s[i] >= '0' && s[i] <= '9')
{
vis++;
v[i] = 1;
}
}
for(int i = 0; i <= n - 1; i++)
{
if(v[i]) continue;
cout<<s[i];
}
cout<<endl;
cout<<vis<<endl;
return 0;
}
问题 D: 数字游戏
题目描述
小明和小华两位同学是非常要好的小伙伴。两人经常在一起做作业、玩游戏。周末的一天,两人做完作业后,商量一起玩一个数字游戏。游戏的规则是:在任意的一段四位自然数区间内,找出符合以下特点的四位自然数ABCD:
(1)这个四位自然数被6整除;
(2)千位数字与百位数字构成的两位数AB是一个质数;
(3)十位数字与个位数字构成的两位数CD是一个完全平方数。
没有学过程序设计的小华同学,在(2000,3000)的范围中,找出的符合以上特点的数字只有三个:2316,2916, 2964,显然他找到的数据不够全面,漏掉了一些数字。而学过程序设计的小明同学用计算机编程的方法很快求出了所有符合要求的答案。现给出任意自然数M ~N的区间,作为编程小能手的你,能否很快求出所有满足上述条件的数值,并统计出它们的个数呢?
输入
只有一行,包含用一个空格隔开的两个四位自然数M和N(其中1000≤M<N≤9999)。
输出
共有两行:
第一行:为所有满足上述条件的数值,数值之间用一个空格隔开;
最后一行:只有一个数,为满足上述条件的数值的个数。
样例输入 Copy
2000 3000
样例输出 Copy
2304 2316 2364 2904 2916 2964 6
水题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool a[105] = {0};
bool f1(int x)
{
if(!(x % 6))
{
return true;
}
return false;
}
bool f2(int x1)
{
int A1 = x1 / 1000;
int B1 = (x1 % 1000) / 100;
int C1 = A1 * 10 + B1;
if(!a[C1])
{
return true;
}
return false;
}
bool f3(int x2)
{
int C2 = x2 % 100;
for(int j = 0; j <= 9; j++)
{
if(C2 == (j * j))
{
return true;
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n,m;
cin>>n>>m;
a[0] = true;
a[1] = true;
for(int i = 2; i <= 105; i++)
{
if(!a[i])
{
for(int j = 2 * i; j <= 105; j += i)
{
a[j] = true;
}
}
}
int ans = 0;
for(int i = n; i <= m; i++)
{
if(f1(i) && f2(i) && f3(i))
{
cout<<i<<' ';
ans++;
}
}
cout<<endl;
cout<<ans<<endl;
return 0;
}
问题 E: 挑选队员I
题目描述
学校舞蹈小组举行形体课训练,王老师将队员的队形编排成了M行N列,现已知所有队员的身高,数值为整数,单位:厘米。根据舞蹈的要求:要在所有队员中:
(1)挑选出每行身高最高的同学作为小组的组长协助老师进行训练;
(2)求出每行队员们的平均身高;
(3)最后要在所有队员中挑选出身高大于165厘米的队员进行领舞,并将身高大于165厘米的队员按从高到低的顺序重新排队。
请同学们用计算机编程的方法来解决以上问题。
输入
共有M+1行:
第一行有:用空格隔开的两个整数M、N,分别代表身高数据的行数和列数(其中1≤M≤6,1≤N≤8);
后M行:每一行对应的是N列数据,表示所有学生的身高尺寸,数值为整数,单位:厘米(其中:150厘米≤身高≤180厘米),数据之间空1格;
输出
共有2M+1行:
前M行:每行一个数据为在该行中身高最高的那位队员的高度;
后M行:每行一个数据为每行队员的平均身高(要求:四舍五入,保留整数);
最后一行:为所有身高大于165厘米的队员的身高(按从高到低的顺序),数据之间空1格。
样例输入 Copy
3 4 151 161 156 154 171 163 168 157 162 156 153 172
样例输出 Copy
161 171 172 156 165 161 172 171 168
水题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n,m;
cin>>n>>m;
int a[10][10] = {0};
double sum[10]= {0};
int h[100] = {0};
int vis = 1;
for(int i = 1; i <= n; i++)
{
int H = 0;
sum[i] = 0;
for(int j = 1; j <= m; j++)
{
cin>>a[i][j];
sum[i] += a[i][j];
if(a[i][j] > H)
{
H = a[i][j];
}
if(a[i][j] > 165)
{
h[vis] = a[i][j];
vis++;
}
}
cout<<H<<endl;
}
for(int i = 1; i <= n; i++)
{
if((int)(sum[i] / m + 0.5) > (int)(sum[i] / m))
{
cout<<(int)(sum[i] / m + 0.5)<<endl;
}
else
{
cout<<(int)(sum[i] / m)<<endl;
}
}
sort(h + 1, h + vis, cmp);
for(int i = 1; i <= vis - 1; i++)
{
cout<<h[i];
if(i != (vis - 1))
{
cout<<' ';
}
else
{
cout<<endl;
}
}
return 0;
}
问题 F: 分蛋糕
题目描述
WZJ过生日了,他邀请了许多人来参加她的生日聚会,生日聚会中最重要的一件事情就是吃蛋糕了。WZJ共邀请了n个人,这些人的心里都想好了自己要多少克蛋糕。如果给他少了,他就会郁闷(没有吃到足够多的蛋糕)。如果给他多了,他也会郁闷(因为他不能浪费,需要把这些蛋糕都吃了,撑着了会不舒服)。一个人的郁闷指数为他想要的蛋糕克数与他实际得到的蛋糕克数之差的绝对值。WZJ想指定一个人想要的蛋糕克数作为标准,给每个人都是这么多蛋糕。聚会是件高兴的事情,同学们郁闷指数之和越小越好,现在他需要知道同学们的郁闷指数最低值是多少,请你编写程序帮他实现。
输入
共有两行:
第一行:为正整数n,表示参加聚会总共有n位同学。
第二行:为n个正整数(n<10000),表示每个人想要得到的蛋糕克数(<=1000)。
输出
只有一行:为输出所有人的郁闷指数之和的最小值。
样例输入 Copy
5 100 300 200 100 300
样例输出 Copy
400
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int a[10005] = {0};
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
}
int ans;
int min = 100000000;
for(int i = 1; i <= n; i++)
{
ans = 0;
for(int j = 1; j <= n; j++)
{
ans += abs(a[i] - a[j]);
}
if(ans < min)
{
min = ans;
}
}
cout<<min<<endl;
return 0;
}
问题 G: 垒城堡
题目描述
XJR从小就喜欢用积木搭建各种各样的模型,虽然现在上六年级了,学习任务重了很多,但他学习之余,有空还忘不了拿出他那些积木进行一些富有创意的实验。一天,他拿出了一盒积木,碰巧发现这个盒子里装的所有积木都是棱长不等的正方体,他突发奇想,我拿这些积木来垒一个城堡,这个城堡可能达到多大的高度呢?XJR数学很好,他知道这些积木可以实现多种不同的高度,已知这些积木的棱长,他从数学角度推算出可能能够获得多少种不同的高度,但比较复杂。会编程的你,用程序来实现应该不是一件难事,你能帮助XJR用程序来实现吗?
已知积木的个数和每一个积木的棱长,你至少从中选择一个积木垒建城堡,请你编程求出城堡可以达到多少种不同的高度。
输入
共有两行:
第一行:是一个整数N(N<=100),表示一共有N个积木;
第二行:是N个正整数,两数之间用一个空格分隔,分别表示N个积木的棱长,每个积木的棱长不超过100。积木按照从大到小的尺寸给出。
输出
只有一个整数,表示城堡可能达到的多少种不同高度。
样例输入 Copy
3 3 2 1
样例输出 Copy
6
其实这题也是水题 dp算不上 直接莽过去就是了 当时没有写出来 得反思
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool dp[10005] = {0};
bool dpt[10005] = {0};
int a[105] = {0};
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
for(int j = 1; j <= 10005; j++)
{
if(dp[j])
{
dpt[j + a[i]] = 1;
}
}
for(int j = 1; j <= 10005; j++)
{
if(dpt[j] && !dp[j])
{
dp[j] = 1;
dpt[j] = 0;
}
}
dp[a[i]] = 1;
}
int ans = 0;
for(int i = 1; i <= 10005; i++)
{
if(dp[i])
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}
问题 H: 哈夫曼编码
题目描述
哈夫曼编码是一种编码方式,是可变字长编码的一种,由Huffman于1952年提出。该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫Huffman编码。简单地来说,就是出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的。
现在请你模拟这样的原则对给定的一个字符串进行字母统计。
输入
输入只有一行,是一个字符串,由小写英文字母组成,长度不超过255个字符。
输出
输出有若干行,每行有两部分组成:一个字母和该字母出现的频率,中间用一个空格分隔,并按频率高低排列,频率相同时则按字母的ASC码的先后顺序排列。
样例输入 Copy
soon
样例输出 Copy
o 2 n 1 s 1
水题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
string s;
cin>>s;
int a[30] = {0};
int n = s.size();
for(int i = 0; i <= n - 1; i++)
{
a[s[i] - 'a']++;
}
int max = 0;
for(int i = 0; i <= 25; i++)
{
if(a[i] > max)
{
max = a[i];
}
}
for(int i = max; i >= 1; i--)
{
for(int j = 0; j <= 25; j++)
{
if(a[j] == i)
{
char c = 'a' + j;
cout<<c<<' '<<a[j]<<endl;
}
}
}
return 0;
}
问题 I: 立方和
题目描述
现给出一个三位数,先对这个三位数的各位数字的立方求和,然后再对求出的和中的各位数字的立方求和,如此一直继续下去,判断最后能否得到一个不再变化的固定值。如能得到一个固定值,就求出这个固定值;如果不能,则输出提示信息“error”。另外请注意,在求解过程中,若某一次求和过程中得到的值超过三位数,则只取后三位继续求立方和……
例如,对于三位数111,则第一次计算应是1×1×1+1×1×1+1×1×1=3,第二次计算应是0×0×0+0×0×0+3×3×3=27,第三次计算应是0×0×0+2×2×2+7×7×7=351,第四次计算应是3×3×3+5×5×5+1×1×1=153,第五次计算应是1×1×1+5×5×5+3×3×3=153,与第四次计算的结果相同,这时可不再计算,输出固定值153。
亲爱的同学,请你也来计算一下。
输入
输入只有一行,是一个三位数。
输出
输出也只有一行,如能得到一个固定值,则输出这个固定值;如不能,则输出一个提示信息“error”。
样例输入 Copy
111
样例输出 Copy
153
这题永远达不成的的判断是10000次 竟然对了 我也不知道为什么
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int f2(int a, int b, int c)
{
int ans = a*a*a + b*b*b + c*c*c;
return ans;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n;
cin>>n;
int a = n / 100;
int b = (n % 100) / 10;
int c = n % 10;
bool flag = true;
int n1 = n;
int n2 = f2(a, b, c);
if(n2 > 999)
{
n2 = n2 % 1000;
}
//原来的三位数 立方处理过的三位数
int k = 0;
while(n1 != n2 && flag)
{
n1 = n2;
a = n1 / 100;
b = (n1 % 100) / 10;
c = n1 % 10;
n2 = f2(a, b, c);
if(n2 > 999)
{
n2 = n2 % 1000;
}
k++;
if(k > 10000) flag = false;
}
if(flag)
{
cout<<n1<<endl;
}
else
{
cout<<"error"<<endl;
}
return 0;
}
问题 J: 智力大奖赛
题目描述
一年一度的校园智力大奖赛是小明最喜爱的活动,今年的比赛中学校新设了一个智取能量棒的项目,小明很想参加。这个项目的比赛规则是这样的:考官在一个仪器上输入一个数,仪器屏幕上就会出现一个由许多能量棒组成的大三角形(一个大三角形有若干个小三角形组成),已知每根能量棒的长度都是一样的,每个小三角形由三根能量棒组成,若谁能快速答出其中小三角形的个数和能量棒的总个数,则谁就赢得了比赛,这些能量棒作为奖励也就属于他了。现在小明想邀请你和他一起参加这项比赛。
输入
输入只有一行,有一个整数N,表示大三角形的层数(N≦45000)。
输出
输出有两行。
第一行只有一个数,表示小三角形的个数;
第二行也只有一个数,表示能量棒的个数。
样例输入 Copy
8
样例输出 Copy
64 108
提示
在40%的数据中,1≤N≤150在70%的数据中,1≤N≤30000
在100%的数据中,1≤N≤45000
水
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
long long n;
long long ans1 = 0;
long long ans2 = 0;
cin>>n;
for(long long i = 1; i <= n; i++)
{
ans1 = ans1 + 2 * i - 1;
ans2 = ans2 + 3 * i;
}
cout<<ans1<<endl;
cout<<ans2<<endl;
return 0;
}
问题 K: 求素数I
题目描述
现给你N个0~9的数字并排成了一列,同时还给出了一个取数长度L。规定先从第1个数字开始从左往右连续取L个数字,拼成一个长度为L位(最高位为0的L-1位数除外)的数,然后从第2个数字开始从左往右连续取L个数字……,这样,最后最多可以得到N-L+1个L位数。现在请你将这些L位数中的素数按从小到大的顺序输出(如果产生重复,只需输出一个)。
输入
输入共有两行。
第一行为N和L,中间用空格隔开。(1≤N≤100,1≤L≤7)第二行为N个0~9的数字,中间用空格隔开。
输出
输出只有一行,含全部满足条件的素数,中间用逗号隔开。
样例输入 Copy
10 3 8 9 1 0 2 3 5 4 7 6
样例输出 Copy
547
水
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
const int maxn = 1e7 + 5;
int a[maxn] = {0};
long long f1(int x)
{
long long ans = 1;
while(x--)
{
ans *= 10;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
a[0] = 1;
a[1] = 1;
for(int i = 2; i <= maxn; i++)
{
if(!a[i])
{
for(int j = 2 * i; j <= maxn; j += i)
{
a[j] = 1;
}
}
}
int n,m;
cin>>n>>m;
int num[105] = {0};
for(int i = 1; i <= n; i++)
{
cin>>num[i];
}
priority_queue <int,vector<int>,greater<int> > q;
for(int i = 1; i <= (n - m + 1); i++)
{
if(!num[i]) continue;
long long ans = 0;
for(int j = 0; j <= m - 1; j++)
{
ans = ans + num[i + j] * f1(m - j - 1);
}
if(!a[ans])
{
q.push(ans);
}
}
int l = 0;
int dp[100] = {0};
int i = 1;
while(!q.empty())
{
int now = q.top();
q.pop();
if(now != l)
{
dp[i] = now;
i++;
l = now;
}
}
for(int j = 1; j <= i - 1; j++)
{
cout<<dp[j];
if(j != (i - 1))
{
cout<<',';
}
}
cout<<endl;
return 0;
}
今天说实话大的不怎么样
明天加油吧