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;
}