8.1暑期第七次课下午总结

最后更新于 2025-08-02 21:25:16
作者
分类 个人记录

P5594 【XR-4】模拟赛

错误原因

用一维数组写时没思路了

解题思路

1、使用二维数组标记

一维数组标记还是挺麻烦的,所以我们使用二维数组标记。

可如何标记?

题目说每个人要在他们的休息时间依次打完m场比赛,所以有的人虽然同一天有休息,但做的可能不是同一套试题

所以我们在输入每个人哪一天有休息时,也要判断ta打的是哪一场比赛

代码如下:

long long a[10005][10005];
long long n,m,k,x;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
        cin>>x;
        //第i个人在第x天,第j场打
        a[x][j]=1;//因为第x天第j场比赛有人打,记录一下
    }
}

2、判断每天有多少种不同的比赛要打

可以定义一个ans记录,然后在a[i][j]不为0时记录一次(i为第几天,j为第几场比赛)

代码:

 for(int i=1;i<=k;i++){
        int ans=0;
        for(int j=1;j<=m;j++){
            if(a[i][j]!=0)
                ans++;//第i天第j场比赛有人打
        }
        cout<<ans<<" ";
    }

最终代码:

#include<bits/stdc++.h>
using namespace std;
long long a[10005][10005];//代表第i天的第j场比赛有没有人打
int main(){
	long long n,m,k,x;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>x;
            //第i个人在第x天,第j场打
            a[x][j]=1;//因为第x天第j场比赛有人打,记录一下
        }
    }
    for(int i=1;i<=k;i++){
        int ans=0;
        for(int j=1;j<=m;j++){
            if(a[i][j]!=0)
                ans++;//第i天第j场比赛有人打
        }
        cout<<ans<<" ";
    }
	return 0;
}

P12176 [蓝桥杯 2025 省 Python B] 书架还原

错误原因

冒泡排序忘记写了(其实不用冒泡写)

解题思路

我们要再定义一个mp数组来表示书架编号,然后对应的书籍编号和对应的书架编号放一起即可

所以当a[i]!=i时,证明它没有放在正确的位置上,就要把他与对应书架编号的书本颠倒,次数ans就要+1

最终代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000005],mp[1000005];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];//书籍编号
        mp[a[i]]=i;//书架编号
	}
	int ans=0;
    for(int i=1;i<=n;i++){
        if(a[i]!=i){//当书架编号不等于书籍编号时
            mp[a[i]]=mp[i];
            swap(a[i],a[mp[i]]);//颠倒
            ans++;
        }
    }
    cout<<ans;
	return 0;
}