Codeforces Beta Round #108 (Div2)

这篇博客涵盖了三个算法问题的解决方案:第一题涉及查找在各科目中获得最高分的学生数量;第二题讨论了计算按顺序行走院子的步数问题;第三题研究了通过交换字符生成不同字符串的数量。博主通过实例代码详细解释了每道题的思路和解答过程,强调了理解题目细节的重要性。
摘要由CSDN通过智能技术生成

A - Marks

题意:有n个学生,给每个学生m门课的分数(分数从1到9)。如果这个学生在某科上取得最高分,我们认为这个学生是成功的。求有多少成功的学生
题解:记录每列的最大值,依次判断每个学生是否能取得至少一科的最高分,如果能跳出此层循环,判断下个学生。
代码:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
int mx[MAXN];
int main(){
	int n,m;
	cin>>n>>m;
	string s[MAXN];
	for(int i=0;i<n;i++){
		cin>>s[i];
		for(int j=0;j<m;j++){
			mx[j]=max(mx[j],s[i][j]-'0');
		}
	}
	int cnt=0,t;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			t=s[i][j]-'0';
			if(t>=mx[j]){
				cnt++;
				break;
			}
		}
	}
	cout<<cnt<<endl;
}

B - Steps

题意:给院子的大小nxm(1<=x<=n,1<=y<=m,x是行的索引,y是列的索引)和Vasya最初的坐标(xc, yc),给k个非零长度的向量(dxi, dyi)。男孩按照从1到k的顺序选择所有向量,在男孩选择了一个当前向量后,他在向量方向上选择了最大可能的有效步数(也有可能是零步数)。一步的定义是:如果Vasya定位在正方形(x, y),当前向量是(dx, dy), Vasya一步移动到正方形(x+ dx, y+ dy)。只要不走出院子都是有有效的步数。
题解:从1到k依次取当前向量能走最大的步数,当dx=0或者dy=0时需要判断一下,求和。
该题总结:第一遍读题一直没发现是按顺序从1-n,就觉得好难,想了好长时间。发现从1到k后,没注意1<=x<=n,1<=y<=m,以为是从0开始。然后我n和m还写反了,0还忘记判断了。这个题读的太马虎了,下次注意。。。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 10010
int main(){
	ll n,m,xc,yc,x,y;
	cin>>n>>m;
	cin>>xc>>yc;
	ll k;
	cin>>k;
	ll sum=0;
	ll t1=0,t2=0,t=0;
	for(ll i=0;i<k;i++){
		cin>>x>>y;
		if(x>0){
			t1=(n-xc)/x;
		}else if(x<0){
			t1=(1-xc)/x;
		}
		if(y>0){
			t2=(m-yc)/y;
		}else if(y<0){
			t2=(1-yc)/y;
		} 
		if(x==0){
			t=t2;
		}else if(y==0){
			t=t1;
		}else{
			t=min(t1,t2);
		}
		xc=xc+t*x;
		yc=yc+t*y;
		sum+=t;
	}
	cout<<sum<<endl;
	return 0;
} 

C - Pocket Book

题意:给n个长度为m的字符串,任意两个字符串可以交换前k个字符(1<=k<=m),交换后字符串变成新的字符串,问最后能产生多少个不同的字符串.
题解:排列组合,统计每一列有多少不同的字符,相乘取模输出。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 110
#define mod 1000000007
set<char>ss[MAXN];
int main(){
	int n,m;
	cin>>n>>m;
	string s;
	for(int i=0;i<n;i++){
		cin>>s;
		for(int j=0;j<m;j++){
			ss[j].insert(s[j]);
		}
	}
	ll ans=1;
	for(int i=0;i<m;i++){
		ans=(ans%mod*ss[i].size()%mod)%mod;
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值