第一题:win
题目:为了实现建设世界一流大学和建设世界一流学科的目标,不少大学都用各种方式提升排名:发表论文、 申请基金、提升多样性. . . 不过看起来这些并不容易,而且 US News 和 Times 这样的机构并不一定会 公正评判你的工作。因此,一些大学更聪明——自己发布排行榜,这可以使得自己的名次间接变好。比如,通过上海某大学发布的软科排名(ARWU)作为桥梁,咖波甚至可以论证他的小汤河职业技术学院要好于清华大学:
现在,给定三个大写字母,你需要判断:
如果这三个大写字母分别为:NEU,则输出:Win
如果这三个大写字母分别为:THU,则输出:Lose
否则输出:?
输入格式:
一行三个大写字母,如题意所示
#include<bits/stdc++.h>//签到题
using namespace std;
int main()
{
string s;
cin>>s;
if(s=="NEU")cout<<"Win";
else if(s=="THU")cout<<"Lose";
else cout<<"?";
return 0;
}
题二:比大小
知名数学家田所浩二先生证明了:
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≤10^9)
输出格式:
输出总共T行,对于第i行:
如果"a>b",则输出:>
如果"a=b",则输出:=
如果"a<b",则输出:<
题解:10的九次方且这道题比较的是每个字符,显然用string接受输入,while接受多组数据
对于“=‘的情况只有一种就是string a=b;
对于不等的情况:从第一个字符开始比较,遍历,然后如果在前面字符都相同的情况下,i大于了某个字符串的长度,则另外一个字符串更大,退出循环。
#include<bits/stdc++.h>
using namespace std;
string a,b;
int T;
int main(){
cin>>T;
while(T--){
cin>>a>>b;
int A=a.length();
int B=b.length();
if(a==b)cout<<"="<<endl;
else for(int i=0;i<max(A,B);i++){
if(i<A&&i<B){
if(a[i]>b[i]){cout<<">"<<endl;break;}
else if(a[i]<b[i]){cout<<'<'<<endl; break;}
}
else if(A>B){cout<<">"<<endl;break;}
else if(A<B){ cout<<'<'<<endl;break;}
}
}
return 0;
}
题三:矩阵乘法
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。每行最后一个数后面有一个空格。
题解:直接带公式,那个样例仅供参考,照
Ci,j=∑t=1P(或K)Ai,t∗Bt,j写
#include<bits/stdc++.h>
#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105],c[105][105];
int main()
{
int N,P,M;
cin>>N>>P>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=P;j++)cin>>a[i][j];
}
for(int i=1;i<=P;i++){
for(int j=1;j<=M;j++)cin>>b[i][j];
}
int t=1;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
while(t<=P){
c[i][j]+=(a[i][t]*b[t][j]);
t++;
}
t=1;
cout<<c[i][j]<<' ';
}
cout<<endl;
}
}
题四:疯狂的星期四
已知2022年10月11日是星期二
现在给定你一个日期,你需要计算当天是星期几。
输入格式:
一行三个整数M,D,Y,表示所求日期为:M月D日,Y年
1600≤Y≤2400,保证输入日期均为合法日期。
输出格式:
输出一个数字,表示当前是星期几。
如果星期天,则输出0。
法一:用所给日期与输入的日期的天数差的绝对值+今天的星期几对7取模;
设f(x)为某年某月某天距1年1月1日的天数
差:abs(f(today)-f(cin))
法二:用神牛的公式:[y-1+(y-1)/4-(y-1)/100+(y-1)/400]+date(其中y为年份,date为这一年的累计天数),然后对这个值对7取模,即为答案;(公式如何记住:用(y-1)+(y-1)/为四的倍数+(y-1)不为400倍数余年判断-(y-1)/100)闰年的第二种+累计日期date
注意:闰年的判断,以及闰年2月有29天,数据最好用long long 储存,y必须为整形;
#include<bits/stdc++.h>
using namespace std;
int m,d,y;
int M[12]={31,28,31,30,31,30,31,31,30,31,30,30};
int main()
{
cin>>m>>d>>y;
long long sum;
int s=d;
if(y%4==0&&y%400!=0||y%100==0)M[1]++;
for(int i=1;i<m;i++){
s+=M[i-1];
}
sum=(y-1+(y-1)/4-(y-1)/100+(y-1)/400)+s;
cout<<sum%7;
return 0;
}
题五:排列
这道题破大防,呜呜呜!!!白学少年,枉费学了这么多年数学,智商遭受严重打击
给你一个长度为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
题解:其实仔细观察可以发现:你的操作不同,并不影响最终的结果。
佬的解答:事实上每次操作就是:选定一个长度为 的区间,将这段区间里的数全部转换成区间最大值。 可以发现: 1. 如果一次操作的区间里没有 ,那这次操作一定是无意义的。 2. 最优的情况肯定是每次操作区间里只有1个 ,然后每次将 个数转换为 。 其实就是:总共有 个不为 的数,每次可以转换 个数为 。故答案为: 。 (事实上排列的具体形式对答案没有任何影响,只需要读入 即可)
注意一个取整函数就行:向上取整:double ceil(double x)
#include<bits/stdc++.h>
using namespace std;
double n,k;
int p[1000005];
double ans;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>p[i];
cout<<ceil((n-1)/(k-1));
return 0;
}
题六:小布点
现在是跑步时间。
咖波需要依次经过地图上的五个点位才能完成任务,为了节省体力,他希望以最短的距离跑完这五个点位。
现在给出这五个点位的坐标,你需要帮咖波求出最短距离。(咖波可以从任意一个坐标开始跑步)
输入格式:
总共五行
第i行有两个整数xi,yi(−103≤xi,yi≤103),表示第i个点位的坐标值。
数据保证不存在坐标相同的点。
输出格式:
输出一个实数,表示最短的跑步距离(保留三位小数)
题解:自定义一个distance函数求距离,然后一个next_permutation()全排列函数即可解决
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
using namespace std;
struct dt {
int x, y;
};
double distance(dt a, dt b) {
double X, Y;
X = (a.x - b.x) * (a.x - b.x);
Y = (a.y - b.y) * (a.y - b.y);
return sqrt(X + Y);
}
int main()
{
dt d[6];
int a[6] = { 0,1,2,3,4,5 };
double ans = 575857;
for (int i = 1; i <= 5; i++)cin >> d[i].x >> d[i].y;
do {
double s = 0.0;
for (int i = 1; i <= 4; i++) {
s += distance(d[a[i]], d[a[i+1]]);
}
ans = min(s, ans);
} while (next_permutation(a+ 1, a+ 6));
cout << fixed << setprecision(3) << ans;
return 0;
}
剩下两题不是很理解呜呜呜!!罢工不写鸟。