原创不易,未经允许,禁止转载。
博客主页:https://blog.csdn.net/Edviv
调和平均
题目大意
N
个正数的算数平均是这些数的和除以N
,它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。
输入格式
每个输入包含
1
个测试用例。每个测试用例第1
行给出正整数N
(≤1000
);第2
行给出N
个正数,都在区间[0.1,100]
内。在一行中输出给定数列的调和平均值,输出小数点后2位。
输出格式
输入样例
8
10 15 12.7 0.3 4 13 1 15.6
输出样例
1.61
累计求 1.0 x \frac{1.0}{x} x1.0 , 最后答案就是 n a n s \frac{n}{ans} ansn
#include <bits/stdc++.h>
using namespace std;
int main()
{
double n, x, ans = 0;
scanf("%lf",&n);
for(int i = 0; i < n; i++)
{
scanf(" %lf",&x);
ans += 1.0/x;
}
printf("%.2f\n",n/ans);
return 0;
}
寻找 250
对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到
题目大意
250
这个高大上的感人数字。输入在一行中给出不知道多少个绝对值不超过
输入格式
1000
的整数,其中保证至少存在一个250
。在一行中输出第一次出现的
输出格式
250
是对方扔过来的第几个数字(计数从1
开始)。题目保证输出的数字在整型范围内。
输入样例
888 666 123 -233 250 13 250 -222
输出样例
5
i s t r i n g s t r e a m 读 取 istringstream读取 istringstream读取
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin,s);
istringstream ssin(s);
int x, ans = 1;
while(ssin >> x)
if(x != 250) ans++;
else break;
printf("%d\n",ans);
return 0;
}
幸运彩票
彩票的号码有
题目大意
6
位数字,若一张彩票的前3
位上的数之和等于后3
位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。输入在第一行中给出一个正整数
输入格式
N
(≤100
)。随后N
行,每行给出一张彩票的6
位数字。对每张彩票,如果它是幸运的,就在一行中输出
输出格式
You are lucky!
;否则输出Wish you good luck.
。
输入样例
2
233008
123456
输出样例
You are lucky!
Wish you good luck.
s u b s t r substr substr 求子串
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
string x = s.substr(0,3);
string y = s.substr(3,3);
int tx = 0, ty = 0;
for(int i = 0; i < 3; i++)
{
tx += (int)(x[i] - '0');
ty += (int)(y[i] - '0');
}
if(tx == ty) puts("You are lucky!");
else puts("Wish you good luck.");
}
return 0;
}
敲笨钟
微博上有个自称“大笨钟
题目链接
V
”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压 “ong
” 韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong
)和“弓”(gong
)都压了“ong
”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。 现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。输入首先在第一行给出一个不超过
输入格式
20
的正整数N
。随后N
行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过6
个字符,每行字符的总长度不超过100
,并且下半句诗至少有3
个字。对每一行诗句,判断其是否压 “
输出格式
ong
” 韵。即上下两句末尾的字都是 “ong
” 结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出Skipped
,即跳过此句。
输入样例
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
getchar();
while(t--)
{
string s;
getline(cin,s);
int len = s.size(), cnt = 0;
for(int i = 0; i < len; i++)
{
if(s[i] == ',' && s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o')
cnt++;
if(s[i] == '.' && s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o')
cnt++;
}
if(cnt == 2)
{
int pos = 0, num = 0;
for(int i = len; ~i; i--)
{
if(s[i] == ' ') num++, pos = i;
if(num >= 3) break;
}
for(int i = 0; i <= pos; i++) cout<<s[i];
cout<<"qiao ben zhong."<<'\n';
}
else puts("Skipped");
}
return 0;
}
天梯赛座位分配
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有
题目大意
N
所学校参赛,第i
所学校有M[i]
支队伍,每队10
位参赛选手。令每校选手排成一列纵队,第i+1
队的选手排在第i
队选手之后。从第1
所学校开始,各校的第1
位队员顺次入座,然后是各校的第2
位队员…… 以此类推。如果最后只剩下1
所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从1
开始编号。输入在一行中给出参赛的高校数
输入格式
N
(不超过100
的正整数);第二行给出N
个不超过10
的正整数,其中第i
个数对应第i
所高校的参赛队伍数,数字间以空格分隔。从第
输出格式
1
所高校的第1
支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以1
个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X
,从1
开始。
输入样例
3
3 4 2
输出样例
#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60
坑点在于如果最后一组与前面一组差值等于1隔开坐就加2开始,否则最后剩下的第一个人不能直接跳过,这个人后面的人才是从加2直接开始坐。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 107;
int a[maxn],b[maxn];
vector<int> sch[maxn];
int main()
{
int n, tot = 0;
scanf(" %d",&n);
for(int i = 1; i <= n; i++) scanf(" %d",&a[i]), tot += a[i], b[i] = a[i];
tot *= 10;
sort(b+1,b+1+n);
int cha = b[n] - b[n-1];
int num = 1, peo = 0, cnt = 0, col = 0;
while(peo < tot)
{
int t = 0;
for(int i = 1; i <= n; i++) if(cnt >= a[i]) t++;
for(int i = 1; i <= n; i++)
{
if(cnt < a[i])
{
if(t != n - 1) sch[i].push_back(num),num++;
else if(n != 1)
{
if(cha == 1) sch[i].push_back(num+1);
else sch[i].push_back(num);
num += 2;
}
else sch[i].push_back(num), num += 2;
peo++;
}
}
col++;
if(col%10 == 0) cnt++;
}
for(int i = 1; i <= n; i++)
{
printf("#%d\n",i);
int k = 0;
for(int j = 0; j < sch[i].size(); j++)
{
if(!k) printf("%d",sch[i][j]);
else printf(" %d",sch[i][j]);
k++;
if(k%10 == 0) puts(""), k = 0;
}
}
return 0;
}
情人节
“
题目大意
2
月14
情人节了,我决定造福大家。第2
个赞和第14
个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过
输入格式
10
个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。根据点赞情况在一行中输出结论:若存在第
输出格式
2
个人A
和第14
个人B
,则输出“A and B are inviting you to dinner...
”;若只有A
没有B
,则输出“A is the only one for you...
”;若连A
都没有,则输出“Momo... No one is for you ...
”。
输入样例
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.
输出样例
Magi and Potaty are inviting you to dinner...
#include <bits/stdc++.h>
using namespace std;
string ss[100007];
int main()
{
int p = 0;
string s;
while(getline(cin,s))
{
if(s == ".") break;
ss[++p] = s;
}
if(p >= 14) cout<<ss[2]<<" and "<<ss[14]<<" are inviting you to dinner..."<<'\n';
else if(p >= 2) cout<<ss[2]<<" is the only one for you..."<<'\n';
else cout<<"Momo... No one is for you ..."<<'\n';
return 0;
}
倒数第N个字符串
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为
题目大意
L
,从L
个a
开始,以1
为步长递增。例如当L
为3
时,序列为{aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }
。这个序列的倒数第27
个字符串就是zyz
。对于任意给定的L
,本题要求你给出对应序列倒数第N
个字符串。输入在一行中给出两个正整数
输入格式
L
(2 ≤ L ≤ 6)
和N
( N ≤ 1e5)
。在一行中输出对应序列倒数第
输出格式
N
个字符串。题目保证这个字符串是存在的。
输入样例
3 7417
输出样例
pat
#include <cstdio>
using namespace std;
char p[27];
int yu[10];
int main()
{
char ch = 'a';
for(int i = 0; i < 26; i++) p[i] = ch++;
int l,n,idx = 0;
scanf(" %d %d",&l,&n);
n--;
while(n > 0)
{
yu[++idx] = n%26;
n /= 26;
}
int len = l - idx;
for(int i = 0; i < len; i++) printf("z");
for(int i = idx; i; i--) printf("%c",p[25-yu[i]]);
return 0;
}
前世档案
网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。
题目大意
现在我们把结论从左到右顺序编号,编号从1
开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。输入第一行给出两个正整数:
输入格式
N
(≤30
)为玩家做一次测试要回答的问题数量;M
(≤100
)为玩家人数。 随后M
行,每行顺次给出玩家的N
个回答。这里用y
代表“是”,用n
代表“否”。对每个玩家,在一行中输出其对应的结论的编号。
输出格式
输入样例
3 4
yny
nyy
nyn
yyn
输出样例
3
5
6
2
父亲节点 p p p,左儿子 p ∗ 2 p*2 p∗2,右儿子 p ∗ 2 + 1 p*2+1 p∗2+1
#include <cstdio>
using namespace std;
int qsm(int a,int b)
{
int res = 1;
while(b)
{
if(b&1) res = res*a;
a = a*a;
b >>= 1;
}
return res;
}
char p[50];
int main()
{
int n,m;
scanf(" %d %d",&n,&m);
while(m--)
{
scanf(" %s",p);
int pos = 1;
for(int i = 0; i < n; i++)
{
if(p[i] == 'y') pos <<= 1;
else pos = pos << 1 | 1;
}
printf("%d\n",pos+1-qsm(2,n));
}
return 0;
}
刮刮彩票
“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:
题目大意
每次游戏玩家会拿到一张彩票,上面会有9
个数字,分别为数字1
到数字9
,数字各不重复,并以3×3
的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从3
横、3
竖、2
斜共8
个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。 现在请你写出一个模拟程序,模拟玩家的游戏过程。输入第一部分给出一张合法的彩票,即用
输入格式
3
行3
列给出0
至9
的数字。0
表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为0
。 第二部给出玩家刮开的三个位置,分为三行,每行按格式x
y
给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第1
行、第1
列。)。数据保证玩家不会重复刮开已刮开的数字。 最后一部分给出玩家选择的方向,即一个整数:1
至3
表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7
、8
分别表示左上到右下的主对角线和右上到左下的副对角线。对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。
输出格式
输入样例
1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7
输出样例
1
5
6
180
#include <bits/stdc++.h>
using namespace std;
int vis[10];
int a[10][10];
int money[26];
void init()
{
money[6] = 10000; money[7] = 36; money[8] = 720; money[9] = 360;
money[10] = 80; money[11] = 252; money[12] = 108; money[13] = 72;
money[14] = 54; money[15] = 180; money[16] = 72; money[17] = 180;
money[18] = 119; money[19] = 36; money[20] = 306; money[21] = 1080;
money[22] = 144; money[23] = 1800; money[24] = 3600;
}
int main()
{
init();
for(int i = 1; i <= 3; i++)
for(int j = 1; j <= 3; j++)
{
int t;
scanf("%d",&t);
a[i][j] = t;
vis[t] = 1;
}
for(int i = 1; i <= 3; i++)
for(int j = 1; j <= 3; j++)
if(!a[i][j])
for(int k = 1; k <= 9; k++)
if(!vis[k]) a[i][j] = k;
for(int i = 1; i <= 3; i++)
{
int x,y;
scanf(" %d %d",&x,&y);
printf("%d\n",a[x][y]);
}
int k;
scanf("%d",&k);
int tot = 0;
if(k == 1) tot = a[1][1] + a[1][2] + a[1][3];
if(k == 2) tot = a[2][1] + a[2][2] + a[2][3];
if(k == 3) tot = a[3][1] + a[3][2] + a[3][3];
if(k == 4) tot = a[1][1] + a[2][1] + a[3][1];
if(k == 5) tot = a[1][2] + a[2][2] + a[3][2];
if(k == 6) tot = a[1][3] + a[2][3] + a[3][3];
if(k == 7) tot = a[1][1] + a[2][2] + a[3][3];
if(k == 8) tot = a[1][3] + a[2][2] + a[3][1];
printf("%d\n",money[tot]);
return 0;
}