7-1 Win
为了实现建设世界一流大学和建设世界一流学科的目标,不少大学都用各种方式提升排名:发表论文、 申请基金、提升多样性. . . 不过看起来这些并不容易,而且 US News 和 Times 这样的机构并不一定会 公正评判你的工作。因此,一些大学更聪明——自己发布排行榜,这可以使得自己的名次间接变好。比如,通过上海某大学发布的软科排名(ARWU)作为桥梁,咖波甚至可以论证他的小汤河职业技术学院要好于清华大学:
现在,给定三个大写字母,你需要判断:
如果这三个大写字母分别为:NEU,则输出:Win
如果这三个大写字母分别为:THU,则输出:Lose
否则输出:?
输入格式:
一行三个大写字母,如题意所示
输出格式:
一行一个字符串,如题意所示
输入样例1:
NEU
输出样例1:
Win
输入样例2:
THU
输出样例2:
Lose
输入样例3:
KFC
输出样例3:
?
代码长度限制
16 KB
时间限制
1000 ms
内存限制
128 MB
题解:
#include<iostream>
#include<string>
using namespace std;
int main() {
string abc;
cin >> abc;
if (abc == "NEU") {
cout << "Win";
}
else if (
abc == "THU") {
cout << "Lose";
}
else {
cout << "?";
}
return 0;
}
7-2 比大小
知名数学家田所浩二先生证明了:
9>10
证明:写下两个数的十进制表示:
9.
10
观察这两个数字从前到后第一个不相同的数字,由于9>1,因此9>10。
用同样的方法,我们可以很容易地证明1919>114514:
1919..
114514
或者是999>99:
99.
999
现在,请你给田所浩二先生写一个程序,用来比较两个输入的数字。
输入格式:
第一行一个整数T(1≤T≤106) ,表示有T组数据
接下来T行,每行两个整数a,b(1≤a,b≤109)
输出格式:
输出总共T行,对于第i行:
如果"a>b",则输出:>
如果"a=b",则输出:=
如果"a<b",则输出:<
输入样例:
5
9 10
114514 1919
999 99
131 131
1314 520
输出样例:
>
<
>
=
<
提示:
为避免输出超时,请使用cout << "\n"替代cout << endl
代码长度限制
16 KB
时间限制
2000 ms
内存限制
128 MB
题解:
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int cl(int e) {
int z = 0;
for (; e > 0;) {
e = e / 10;
z++;
}
return z;
}
int main() {
long long int a = 0;
cin >> a;
for (int b = 0; b < a; b++) {
long long int c, d;
cin >> c >> d;
if (c == d) {
cout << "=\n";
}
else {
int e = cl(c);
int f = cl(d);
d = d * pow(10, e - f);
if ((c - d) > 0)
{
cout << ">\n";
}
else {
cout << "<\n";
}
}
}
return 0;
}
7-3 矩阵乘法
Alice在学线性代数。她觉得线代的计算特别麻烦,于是就来找你,希望你可以给她写一个程序计算两个矩阵的乘积。
矩阵乘法介绍:
矩阵A是一个N行P列的矩阵。
矩阵B是一个K行M列的矩阵。
当P=K时,A和B可以相乘(仅限于AB, BA不一定可行)
假设矩阵C=AB,那么Ci,j=∑t=1P(或K)Ai,t∗Bt,j
举个例子,假设A是一个2×3的矩阵,B是一个3×2的矩阵,最终结果C是一个2×2的矩阵,如下图所示
输入格式:
输入共一行,有三个整数N,P,M(N,P,M≤100)。表示矩阵A是一个N×P的矩阵,矩阵B是一个P×M的矩阵。
接下来N行,每行P个整数,读入矩阵A。
再接下来P行,每行M个整数,读入矩阵B。
数据保证在输入输出数据可以用int类型存储。
输出格式:
输出N行M列的矩阵C。每行最后一个数后面有一个空格。
输入样例:
在这里给出一组输入。例如:
3 3 3
1 3 2
1 0 0
1 2 2
0 0 2
7 5 0
2 1 1
输出样例:
在这里给出相应的输出。例如:
25 17 4
0 0 2
18 12 4
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
#include <iostream>
using namespace std;
int main()
{
int n,p,m;
cin >> n >> p >> m;
int a[100][100],b[100][100],c[100][100]={0};
for(int i = 0;i < n;i++){
for(int j = 0;j < p;j++){
cin >> a[i][j];
}
}
for(int i = 0;i < p;i++){
for(int j = 0;j < m;j++){
cin >> b[i][j];
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
for(int k = 0;k < p;k++){
c[i][j] += a[i][k] * b[k][j];
}
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
cout << c[i][j] << " ";
}
cout << "\n";
}
return 0;
}
7-4 疯狂星期四
已知2022年10月11日是星期二
现在给定你一个日期,你需要计算当天是星期几。
输入格式:
一行三个整数M,D,Y,表示所求日期为:M月D日,Y年
1600≤Y≤2400,保证输入日期均为合法日期。
输出格式:
输出一个数字,表示当前是星期几。
如果星期天,则输出0。
输入样例1:
8 17 1926
输出样例1:
2
输入样例2:
2 29 1904
输出样例2:
1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
using namespace std;
int hanshu(int z,int cha,int year,int yue,int ri,int constyear=2000) {
int pingnianshu=0;
int tianshu = 0;
if (year == constyear) {
}
else {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
z -= 1;
}
pingnianshu = cha - z;
tianshu = pingnianshu * 365 + z * 366;
}
switch(yue)
{
case 12:
tianshu +=30;
case 11:
tianshu +=31;
case 10:
tianshu +=30;
case 9:
tianshu +=31;
case 8:
tianshu +=31 ;
case 7:
tianshu +=30 ;
case 6:
tianshu +=31 ;
case 5:
tianshu +=30 ;
case 4:
tianshu +=31;
case 3:
tianshu +=28;
case 2:
tianshu +=31;
case 1:
break;
}
tianshu += ri;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
if (yue > 2) { tianshu += 1; }
}
tianshu -= 1;
return tianshu;
}
int hanshu2(int z, int cha, int year, int yue, int ri, int constyear = 2000) {
int pingnianshu = 0;
int tianshu = 0;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
z -= 1;
}
pingnianshu = cha - z;
tianshu = pingnianshu * 365 + z * 366;
switch (yue)
{
case 1:
tianshu +=31 ;
case 2:
tianshu +=28 ;
case 3:
tianshu +=31 ;
case 4:
tianshu +=30 ;
case 5:
tianshu +=31 ;
case 6:
tianshu +=30;
case 7:
tianshu +=31 ;
case 8:
tianshu +=31 ;
case 9:
tianshu +=30 ;
case 10:
tianshu +=31 ;
case 11:
tianshu +=30 ;
case 12:
tianshu +=31 ;
break;
}
tianshu -= ri;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (yue < 3) { tianshu += 1; }
}
tianshu += 1;
return tianshu;
}
int hanshu3(int year,int cha,int z,int yue,int ri,int constyear=2000) {
if (year >= constyear) {
cha = year - constyear;
int tishen1 = year;
for (; tishen1 >= 2000; tishen1--) {
if ((tishen1 % 4 == 0 && tishen1 % 100 != 0) || tishen1 % 400 == 0) {
z++;
}
}
int tianshu = hanshu(z, cha, year, yue, ri);
return tianshu;
}
else {
cha = constyear - year;
int tishen2 = year;
for (; tishen2 <= 2000; tishen2++) {
if ((tishen2 % 4 == 0 && tishen2 % 100 != 0) || tishen2 % 400 == 0) {
z++;
}
}
z -= 1;
cha -= 1;
int tianshu = hanshu2(z, cha, year, yue, ri);
return tianshu;
}
}
int main()
{
int z = 0;
int year, yue, ri;
cin >> yue >> ri>> year;
int cha=0;
int constyear = 2000;
int tishen = year;
int tianshu =hanshu3(year, cha, z, yue, ri );
int yvshu = tianshu % 7;
if (year >= constyear) {
switch (yvshu) {
case 0:
cout << 6 << endl;
break;
case 1:
cout << 0 << endl;
break;
case 2:
cout << 1 << endl;
break;
case 3:
cout << 2 << endl;
break;
case 4:
cout <<3 << endl;
break;
case 5:
cout << 4<< endl;
break;
case 6:
cout << 5 << endl;
break;
}
}
else {
switch (yvshu) {
case 0:
cout << 6 << endl;
break;
case 1:
cout << 5 << endl;
break;
case 2:
cout << 4 << endl;
break;
case 3:
cout << 3 << endl;
break;
case 4:
cout << 2<< endl;
break;
case 5:
cout << 1 << endl;
break;
case 6:
cout << 0 << endl;
break;
}
}
return 0;
}
7-5 排列
给你一个长度为n的排列p1,p2,p3,...,pn(1≤pi≤n,且对于任意i=j,都有pi=pj)
再给你一个整数k,每次操作的定义如下:
选定一个下标j(1≤j≤n−k+1),记m=max{pj,pj+1,...,pj+k−1},然后令pj,pj+1,...,pj+k−1的值都等于m。
你需要使用最少的操作次数,使得p中所有元素的值都等于n。
输入格式:
第一行两个整数n,k (2≤n≤106,2≤k≤n)
接下来一行n个整数,用空格隔开,分别表示p1,p2,...,pn
输出格式:
一行一个整数,表示最小的操作次数。
输入样例:
6 3
1 6 4 2 3 5
输出样例:
3
样例解释:
第一次操作选择:j=1,操作后p为:6 6 6 2 3 5
第二次操作选择:j=3,操作后p为:6 6 6 6 6 5
第三次操作选择:j=4,操作后p为:6 6 6 6 6 6
代码长度限制
16 KB
时间限制
1000 ms
内存限制
128 MB
#include<iostream>
using namespace std;
int main()
{
int b, c;
cin >> b >> c;
int a[b];
for (int d = 0; d < b; d++) {
cin >> a[d];
}
int* p=&a[0];
for (int e = 0; e < b-1; e++) {
p = &(*p > a[e + 1] ? *p : a[e + 1]);
}
int changdu = sizeof(a)/4;
int qiandizhi = (long long int)p - (long long int)a;
int qian = qiandizhi/4;
int zuidadizhi = qian + 1;
int hou = changdu -qiandizhi/4-1;
int cishu;
int shengyv;
if(qian<=c-1||hou<=c-1){
if ((changdu - c) % (c - 1) == 0) {
shengyv = (changdu - c) / (c-1);
}
else {
shengyv = (changdu - c) / (c - 1)+1;
}
cishu = shengyv + 1;
}
else {
if (qian%(c-1)==0|| hou % (c - 1) == 0) {
if (qian % (c - 1) == 0) {
int qianshengyv = (zuidadizhi - 1) / (c - 1);
if((changdu - zuidadizhi)%(c-1)==0){
shengyv = (changdu - zuidadizhi)/(c-1);
}
else {
shengyv = (changdu - zuidadizhi) / (c - 1)+1;
}
cishu = qianshengyv + shengyv;
}
else {
int houshengyv = (changdu-zuidadizhi) / (c - 1);
if ((zuidadizhi-1) % (c - 1) == 0) {
shengyv = ( zuidadizhi-1) / (c - 1);
}
else {
shengyv = (zuidadizhi - 1) / (c - 1) + 1;
}
cishu = houshengyv + shengyv;
}
}
else {
if ((changdu-1) %(c - 1)==0) {
cishu = changdu / (c - 1);
}
else {
cishu = changdu / (c - 1) + 1;
}
}
}
cout << cishu;
return 0;
}
7-6 小步点
现在是跑步时间。
咖波需要依次经过地图上的五个点位才能完成任务,为了节省体力,他希望以最短的距离跑完这五个点位。
现在给出这五个点位的坐标,你需要帮咖波求出最短距离。(咖波可以从任意一个坐标开始跑步)
输入格式:
总共五行
第i行有两个整数xi,yi(−103≤xi,yi≤103),表示第i个点位的坐标值。
数据保证不存在坐标相同的点。
输出格式:
输出一个实数,表示最短的跑步距离(保留三位小数)
输入样例:
0 0
0 2
2 2
2 0
1 1
输出样例:
6.828
样例解释:
可选择从(0,0)点开始,依次经过(0,2),(1,1),(2,0),(2,2)
此时距离为:2+2+2+2=6.828,可以证明这是最短的路径。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
double hanshu1(int a, int b, int c, int d) {
int x = pow(a - b, 2) + pow(c - d, 2);
double xx = sqrt(x);
return xx;
}
double hanshu2(int b[5][2]) {
double xxx = 0;
for (int bbb = 0; bbb < 4; bbb++) {
xxx+=hanshu1(b[bbb][0], b[bbb+1][0], b[bbb][1], b[bbb + 1][1]);
}
return xxx;
}
int main()
{
int a[5][2];
int b[5][2];
for (int b = 0; b < 5; b++) {
cin >> a[b][0] >> a[b][1];
}
double xxxx[150];
int i = 0;
for (int a1 = 0; a1 < 5; a1++) {
for (int a2 = 0; a2 < 5; a2++) {
if (a1 == a2) {
continue;
}
for (int a3 = 0; a3 < 5; a3++) {
if (a1 == a3 || a2 == a3) {
continue;
}
for (int a4 = 0; a4 < 5; a4++) {
if (a1 == a4 || a2 == a4 || a3 == a4) {
continue;
}
int a5 = 10 - a1 - a2 - a3 - a4;
for (int a6 = 0; a6 < 2; a6++) {
b[0][a6] = a[a1][a6];
b[1][a6] = a[a2][a6];
b[2][a6] = a[a3][a6];
b[3][a6] = a[a4][a6];
b[4][a6] = a[a5][a6];
}
xxxx[i] = hanshu2(b);
i++;
}
}
}
}
/*0 0
0 2
2 2
2 0
1 1*/
sort(xxxx, xxxx + i);
cout << setiosflags(ios::fixed) << setprecision(3) <<xxxx[0];
return 0;
}
7-7 原神生日会
注:空、荧、派蒙均为游戏原神里的人名。
有a个空(男旅行者)和b个荧(女旅行者)在会场外排队参加原神生日会。不幸的是,会场里只有N个座位,而且已经有若干个派蒙(可以是0个)已经坐在会场里面了。
- 每个男旅行者都希望坐在他边上的是女旅行者或者派蒙。
- 每个女旅行者都希望坐在她边上的是男旅行者或者派蒙。
换句话说,男旅行者不希望和其他男旅行者坐一起,女旅行者不希望和其他女旅行者坐一起。
如果会场内没有符合旅行者心意的位置,那么旅行者会选择不参加原神生日会。
作为活动组织者的你,希望能参加生日会的旅行者尽可能的多,现在给出会场内每个派蒙的位置,请你求出最多有几个旅行者会来参加生日会。
输入格式:
输入共两行。
第一行有三数,分别为N,a,b(1≤n≤2∗105,0≤a,b≤2∗105,a+b>0)。表示会场内有N个位子,会场外有a个男旅行者,有b个女旅行者。
第二行是一个由字符"."和字符"P"组成的字符串。
"."表示空位,"P"表示这个位置被派蒙占了。
输出格式:
输出一个整数,表示最多可以有几个旅行者参加生日会。
输入样例:
在这里给出一组输入。例如:
11 3 10
.P....PP.P.
输出样例:
在这里给出相应的输出。例如:
7
样例解释
我们用P来表示派蒙,A来表示男旅行者,B来表示女旅行者,最终会场内的座位情况是这样的:BPABABPPAPB
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int zuoweishu, nan, nv, kongwei, yi, qian, hou,jieguo;
yi = 0;
qian = 0;
hou = 0;
cin >> zuoweishu >> nan >> nv;
int nann = 0;
int nvv = 0;
string zuowei;
cin >> zuowei;
for (int e = 0; e < zuoweishu; ) {
if (zuowei[e] == 'P') {
e++;//碰到派蒙,跳过
}
else if (zuowei[e] == '.')
{
kongwei = 0;
for (; e < zuowei.size() && zuowei[e] == '.'; e++) {
kongwei++;
}
qian = (kongwei + 1) / 2;
hou = kongwei - qian;
if (qian != hou) {
yi++;
}
nann += qian;
nvv += hou;
}
}
jieguo = min(nann, nan) + min(nv, nvv);
for (int e = 0; e < yi; e++) {
nann--; nvv++;
jieguo = max(jieguo, min(nann, nan) + min(nv, nvv));
}
cout << jieguo;
system("pause");
return 0;
}
7-8 漏字文
有意避免使用某个或某几个特定字母的写成的文章称漏字文(英语lipogram,希腊语lipagrammatos,意为“失踪的字母”),漏字文可能在写作或文字游戏中出现。公元前5世纪希腊诗人里斐奥多鲁斯(Tryphiodorus)写的24卷史诗中,每一卷都省略希腊字母中的一个不同字母。
现在给你一段仅由空格和小写字母组成的字符串,请你找出其中最长的一段连续的漏字文,并输出漏字文的长度(即该段文字中字母的个数)。
输入格式:
输入共两行。
第一行一个数N(1≤N≤105),表示有N个由小写字母组成的单词。
第二行是一个字符串,有N个长度不超过10的单词,每个单词间用一个空格隔开。
输出格式:
一个整数,表示漏字文的长度。
输入样例:
在这里给出一组输入。例如:
9
the quick brown fox jumps over the lazy dog
输出样例:
在这里给出相应的输出。例如:
32
样例解释
“the quick brown fox jumps over the lazy dog”包含了所有的字母。
其中最长的漏字文是“the quick brown fox jumps over the lazy”,长度是32(即里面有32个字母)。这段文字没有字母d和g,符合漏字文的条件。
代码长度限制
16 KB
时间限制
1000 ms
内存限制
256 MB
#include <iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int qujian[205];
string a[1000000];
int main() {
int geshu;
int houyi = 0;
int size = 0;
int zongchangdu = 0;
int zimugeshu = 0;
int zuizhongjieguo = 0;
cin >> geshu;
for (int e = 0; e < geshu; e++)
{
cin >> a[e];
}
for (int e = 0; e < geshu; e++) {
size = a[e].size();
for (int ee = 0; ee < size; ee++) {
if (qujian[a[e][ee]] == 0) {
zimugeshu++;
}
qujian[a[e][ee]] += 1;
}
zongchangdu += size;
if (zimugeshu == 26) {
for (; zimugeshu == 26;) {
size = a[houyi].size();
for (int eee = 0; eee < size; eee++) {
qujian[a[houyi][eee]] -= 1;
if (qujian[a[houyi][eee]] == 0) {
zimugeshu--;
}
}
houyi++;
zongchangdu -= size;
}
}
zuizhongjieguo = max(zuizhongjieguo, zongchangdu);
}
cout << zuizhongjieguo;
system("pause");
return 0;
}