2024年上海月赛7月赛丙组题解(代码仅供参考)

本蒟蒻第一次写上海月赛题解,初测500分就屁颠屁颠跑来CSDN写题解了

 T1 求和问题

这道水题只要从用一个值储存大小,从1~n遍历、更新就好了,这么“难”的题目,直接贴代码:

#include <bits/stdc++.h>
using namespace std;
long long n,a[200005],sum,ans;
int main() {
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++) {
		sum+=a[i];
		if(sum>=0) ans=i;
	}
	cout<<ans;
	return 0;
}

T2 得分排名 

直接sort+比较函数,STL就是香

#include <bits/stdc++.h>
using namespace std;
struct student{
	int num,val;
}a[200005];
bool cmp(student a,student b) {
	if(a.val==b.val) return a.num<b.num;
	return a.val>b.val;
}
int n;
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i].val);
		a[i].num=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) cout<<a[i].num<<"\n";
	return 0;
}

用优先队列也不错,STL太舒服了

T3 录制节目(一)

这道题目应该是在Internet上有类似的题目的,我想到了二分(即O(nlogn)),这道题我的思路就是排序+dp+二分,众所周知,一个节目要么录制,要么不录制

1、录制

若要录制,则转移过来的j节目必须符合:

①j<=i

②j的结束时间小于i的开始时间

因为结束时间是有序的,所以可以排序预处理,通过二分O(logn)的时间复杂度求得j

dp[i]可取dp[j]+1

2、不录制

因为i节目之前的节目结束时间都小于i,所以i节目不录制的最优策略是取前面所有dp的最大值,即dp[i]=max(dp[i-1],dp[i-2],...,dp[1]),因为dp[i-1]已是最优,囊括了前面所有的最大值,则dp[i]可取dp[i-1],,所以前面的无值需再考虑

因此转移方程是dp[i]=max(dp[j]+1,dp[i-1);

j通过二分求得

上代码

#include <bits/stdc++.h>
using namespace std;
struct node{
	int s,t;
}x[200005];
inline bool cmp(node a,node b) {
	if(a.t==b.t) return a.s<b.s;
	return a.t<b.t;
}
int Find(int i) {
	int l=1,r=i-1,ans=0;
	while(l<=r) {
		int mid=(l+r)/2;
		if(x[mid].t<=x[i].s) {
			ans=mid;
			l=mid+1;
		} else r=mid-1;
	}
	return ans;
}
int n,dp[200005],ans;
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d%d",&x[i].s,&x[i].t);
	}
	sort(x+1,x+n+1,cmp);
	for(int i=1;i<=n;i++) {
		int k=Find(i);
		dp[i]=max(dp[i],dp[k]+1);
		dp[i]=max(dp[i],dp[i-1]);
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	return 0;
}

T4 子集归零

这题挺简单的,直接dfs暴力就过了,2的22次方也就百万级别

#include <bits/stdc++.h>
using namespace std;
int ans,n,k[30];
inline void dfs(int sum,int i) {
	if(i==n-1) {
		if(sum==0) ans++;
		if(sum+k[i]==0) {
			sum=0;
			ans++;
		}
		return;
	}
	dfs(sum,i+1);
	dfs(sum+k[i],i+1);
}
int main() {
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&k[i]);
	dfs(0,0);
	cout<<ans;
	return 0;
}

T5 池塘计数

这题dfs的经典题了,让dfs走一下标记一下就好了,没什么坑点和难点,代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,dx[]={1,-1,0,0},dy[]={0,0,1,-1},ans;
char mp[205][205];
void dfs(int x,int y) {
	mp[x][y]='#';
	for(int i=0;i<4;i++) {
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&mp[tx][ty]=='.') dfs(tx,ty);
	}
	return;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			cin>>mp[i][j];
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			if(mp[i][j]=='.') {
				dfs(i,j);
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
} 

总体来说,这次的上海月赛丙组比较水,代码仅供学习,copy后果自负

九宫格键盘是一种在手机键盘上常见的布局方式,主要用于输入中文和其他一些特殊符号。九宫格键盘将26个字母和其他输入选项分布在一个3x3的方格中,每个方格有一个或多个字母。用户通过在方格内滑动手指来选择字母进行输入。上海计算机学会在202010份举办了一场名为“c”的月赛,其中丙组的题目包括了九宫格键盘的应用。 九宫格键盘在手机输入中具有一定的优势。首先,九宫格键盘相对于传统的QWERTY键盘,可以减少单个按键的尺寸,提高了输入的精度。其次,九宫格键盘将字母进行分组排列,大大降低了输入频率较高的字母之间的距离,提高了输入速度。此外,九宫格键盘还提供了一些特殊符号、数字和常用词语的快捷输入功能,使得输入更加方便和快捷。 针对上海计算机学会202010月赛c丙组t3九宫格键盘c这个题目,应该是要求参选手设计一个基于九宫格键盘的输入法或者其他相关的应用程序。具体的题目要求可能涉及到输入法的设计原理、算法优化、界面设计等方面。参选手需要运用自己在计算机学会学习和实践过程中所掌握的知识,结合九宫格键盘的特点和应用场景,设计出一个创新性、实用性强的解决方案。 九宫格键盘在手机输入领域具有广泛的应用前景。随着智能手机的普及和人们对于更高效便捷的输入方式的需求,九宫格键盘的市场需求也在不断增加。因此,对于计算机学会的学生来说,参与这样的竞活动,不仅可以提高自己的技术能力和解决问题的能力,同时也能够加深对于九宫格键盘以及相关领域的理解和应用。这对于学生们今后的学习和发展都将起到积极的促进作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值