2021-11-07
Posted profligate1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-11-07相关的知识,希望对你有一定的参考价值。
|
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、第一次招新赛?
这一次招新赛知识点并不全面,主要时考验一个基础的代码和思维能力,下一周会把知识点完善
二、题解
1.蛇形矩阵(中等)
考察一个基础的规律发现和for循环的应用
代码如下(示例):
#include<stdio.h>
int i[35][35];
int main()
{
int n;
scanf("%d",&n);
int cnt=1;
for(int a=1;a<=n;a++)
{
for(int b=1;b<=n;b++)
{
if(a%2!=0)
i[b][a]=cnt++;//按行输出a为行数不变,奇数行从上到下即b从1~n存下数字
else
i[n-b+1][a]=cnt++;//偶数行从下到上即b从n到1存下数字
}
}
for(int a=1;a<=n;a++)
{
for(int b=1;b<=n;b++)
printf("%d ",i[a][b]);//将结果输出
printf("\\n");
}
return 0;
}
2.Group QQ Speed(防AK)
因为怕你们陷入其中,所以英文劝退
如果所有人在同一组里,由于每个人都可能会禁掉不同的地图,因此我们应该有n + 1 n + 1n+1张地图;
如果每个人单独一组,则需要2张图;
其余情况下,只需要3张地图即可满足题意。
代码如下(示例):
#include <bits/stdc++.h>
#define itn int
#define ll long long
#define rnt register int
#define ull unsigned long long
#define IOF ios_base::sync_with_stdio(false)
#pragma GCC optimize("no-stack-protector")
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
signed main(){
IOF;
int T = 0; cin >> T;
while (T--){
int n, m; cin >> n >> m;
if (n == m) cout << 2 << endl;
else if (m == 1) cout << n + 1 << endl;
else cout << 3 << endl;
}
}
3.对比(困难)
看题的时候就觉得写出这道的是前五,果不其然下😁!如果两个数的底数相同,比较起来就很容易。 我们的数字可以转换成一个公用的基数,只要用公式就可以了
一个简单的实现需要O(N + M)时间和内存。 注意,您需要64位整数! 和不使用 pow。
#include<stdio.h>
long long n, m, x, y, res1, res2, k;
int main()
{
scanf("%lld%lld", &n, &x);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &k);
long long p = n - i, l = 1;
while (p--)
l *= x;
res1 += k * l;
}
scanf("%lld%lld", &m, &y);
for (int i = 1; i <= m; i++)
{
scanf("%lld", &k);
long long p = m - i, l = 1;
while (p--)
l *= y;
res2 += k * l;
}
if (res1 == res2)
printf("=");
else if (res1 > res2)
printf(">");
else
printf("<");
return 0;
}
4.数数字(困难)
这道题的要求是输出从 1 到 n 当中 所有出现的 数字1 的 个数;
这道题如果对于每一个测试样例都从 1 到 n 跑一遍,那么对于一共1e4组的数据,每组数据大小到1e6,则一定会超过题目规定的运行时间; 因此我们要降低我们的程序运行时间;
我们仔细思考程序的运行过程就会发现,对于两次测试数据n_1,n_2,如果我在第一次的数据从 1 跑到 n_1 时,第二次依然从 1 跑到 n_2,那么对于两次运行,我都重复跑了 1 到 n (n < n_1,n < n_2),
因此我们可以尝试处理从 1 到 一个比较大的数(对于这一题来说可以就处理到 1e6);
int ans[1000100];//存储从 1 到 n 中的每一个答案
for (int i = 1; i <= 1000010; i++)
{
int t = i, res = 0;
while (t)//求当前这个数有几个 1
{
if (t % 10 == 1)
res++;
t /= 10;
}
ans[i] = ans[i - 1] + res;//当前的 i 的答案等于等于第 i - 1 的答案加上当前数的1的个数
}
处理完之后我们在读入一个值,输出一个值就行了;
代码:
#include <stdio.h>
int ans[1000100];
int main()
{
for (int i = 1; i <= 1000010; i++)
{
int t = i, res = 0;
while (t)
{
if (t % 10 == 1)
res++;
t /= 10;
}
ans[i] = ans[i - 1] + res;
}
int a;
while (~scanf("%d", &a))
{
printf("%d\\n", ans[a]);
}
return 0;
}
5.国际象棋(中等)
发现了规律后就比较简单了
#include <stdio.h>
#include <algorithm>
using namespace std;
int t, l1, r1, l2, r2;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
if (l1 == l2 && r1 == r2) //特判相同位置
{
printf("0 0 0\\n");
continue;
}
//国王:只需看横纵坐标相差最大的,因为相差小的那个可以用斜来一起走(一步斜 = 直 + 横)
printf("%d ", max(abs(l1 - l2), abs(r1 - r2)));
//皇后
if (l1 - r1 == l2 - r2 || l1 + r1 == l2 + r2 || l1 == l2 || r1 == r2)
printf("1 "); //看能否能一步(直,横,斜)到
else
printf("2 ");
//战车
if (l1 == l2 || r1 == r2)
printf("1\\n"); //同上
else
printf("2\\n");
}
return 0;
}
6.签个到(终极签到)
第一节课第一个强调的东西,遇见纯输出能复制就复制,代码就不给了,全过了。
7.Minimum Ternary String(防AK)
关键是把题意理解为:固定0、2的相对位置,往里随意放1,能得到的最小字典序。
显然,目标是把所有1放到0后1前好,故放到第一个2222前,若没有2则放到字符串最前。
关于存储串的形式,存到数组记1的数目即可,然后打印做处理即可。
给一个只含0、1、2串,只能做相邻的01交换或者相邻的12交换操作,问经过数次操作(可以是0次)能得到的最小字典序的串是什么。
#include<stdio.h>
#include<string.h>
char a[100005];
char b[100005];
int main(){
scanf("%s",a);
int cnt = 0;
int m = strlen(a);
int i;
for (i=0;i<m;i++){
if(a[i]=='1'){
cnt++;
}
}
int step = 0;
int num = 0;
for (i = 0; i < m; i++)
{
if(a[i]=='2'&&step==0){
while(cnt--){
b[num++] = '1';
}
b[num++] = a[i];
step = 1;
}
else if(a[i]!='1'){
b[num++] = a[i];
}
}
printf("%s", b);
if(step==0){
while(cnt--){
printf("1");
}
}
return 0;
}
8.zhg学长到底加了多少学妹的wx(签到)
分别记录a和b的个数然后比较就好了
#include<stdio.h>
int main()
{
int n,m,a,b;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int m;
scanf("%d",&m);//0为学妹,1为学弟
if(m==1)
a++;//当m等于1时,用a记录学弟个数
else
b++;//b记录学弟个数
}
if(a>b)//判断是学弟多还是学妹多
printf("给zhg学长道歉Orz\\n");
else if(a<b)
printf("zhg学长真是个渣男\\n");
else
printf("真是错怪zhg学长了\\n");
return 0;
}
9.打倒BOSS(简单)
用总法力值除以技能法力值乘以技能伤害值看是否能打死boss可以就输出这个技能的编号
#include <stdio.h>
int main()
{
int k, m, n;
scanf("%d%d%d", &k, &m, &n);
int t = 1;
int flag = 0;
while (m--)
{
int x, y;
scanf("%d%d", &x, &y);
if (k / x * y >= n)//判断一下伤害能否高于boss血量
{
printf("%d ", t);
flag = 1;//有技能可以打死boss
}
t++;
}
if (flag == 0)
printf("-1\\n");
return 0;
}
10.zhg学长的心软(一)(简单)
题目比较长,但是挺好写的,一个小小的思维考察 也算半个签到题了 可能因为题面的原因 大部分人还是没有写 但是很简单 若想要不被打扰 每次后面一个用户关灯即是最优解
#include<stdio.h>
const int N=505;
int a[N];
int main() {
int n,cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=2;i<=n-1;i++){ //同样心软(二)一样的边界判断
if(a[i-1]==1&&a[i+1]==1&&a[i]==0)
{
cnt++;
a[i+1]=0;
}
}
printf("%d\\n",cnt);
return 0;
}
11.zhg学长的心软(二)(签到)
没什么好说的 按照题意写就行 注意一下for循环的边界判断
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
int cnt = 0;
for (int i = 2; i <= n - 1; i++) //在这里需要进行for循环的一个边界判断,因为i-1和i+1的缘故,所以i需要从2开始,到n-1结束
{
if (a[i] == (a[i - 1] + a[i + 1])/2)
cnt++;
}
printf("%d\\n",cnt);
return 0;
}
12.逆序数.(签到)
双重for循环,外循环枚举第i个数,内循环从第i+1个数开始进行比较a[i]>a[i+1]则满足逆序对定义
#include<stdio.h>
int a[10005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]>a[j])
printf("<%d,%d>\\n",a[i],a[j]);
}
}
return 0;
}
13.翻硬币(中等)
#include<stdio.h>
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,a,b;
scanf("%d %d %d",&n,&a,&b);
int ans=n-n/a-n/b+n/(a*b/gcd(a,b))*2;
printf以上是关于2021-11-07的主要内容,如果未能解决你的问题,请参考以下文章
研究生学习和工作总结(2021.11.01-2021.11.07)-我在b站读研