neuq招新赛

第一题: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​.

1​0

观察这两个数字从前到后第一个不相同的数字,由于9>1,因此9>10。

用同样的方法,我们可以很容易地证明1919>114514:

19​19..

11​4514

或者是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;
}

剩下两题不是很理解呜呜呜!!罢工不写鸟。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值