2021.5.22 vj补题
A - Marks
题意:给出一个学生人数n,每个学生的m个学科成绩(成绩从1到9)没有空格排列给出。在每科中都有成绩最好的人或者并列,求出最好成绩的人数
思路:求每列成绩中最大的数的个数。求出每列成绩中的最大值,遍历每列的各行若值与最大值一样就用另一个数组标记出来,最后遍历标记数组记录下总个数,即为最终结果。
代码:
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; char s[n+5][m+5]; for(int i=0;i<n;i++) { scanf("%s",&s[i]); } int b[n+5],ct=0; memset(b,0,sizeof(b)); for(int j=0;j<m;j++) { int maxx; maxx=s[0][j]-'0'; for(int i=0;i<n;i++) { maxx=max(s[i][j]-'0',maxx); } //cout<<maxx<<endl; for(int i=0;i<n;i++) { if(s[i][j]-'0'==maxx) { b[i]=1; //cout<<" "<<i<<endl; } } } for(int i=0;i<n;i++) { if(b[i]==1)ct++; } cout<<ct<<endl; }
B - Steps
题意:给出一个方格的格式为n*m,一开始V位于(x,y)处,给出k个向量,对于每个向量都一直按向量的方向移动,但不能走出方格,当要出方格时就停止移动,再进行下一个向量的移动,运行完k次,求V一共移动了多少步。
题解:对于每一次的移动,分横轴和纵轴的两种情况算出在方格允许的范围内可移动的次数a,b,算出两个的最小次数t=min(a,b),求出变化后的x,y,记录下移动的步数s+=t;依次进行k次,求出总s即可。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n,m; cin>>n>>m; ll x,y; cin>>x>>y; int k; cin>>k; ll s=0; while(k--) { ll dx,dy,t,a,b; cin>>dx>>dy; if(dx<0) { a=(x-1)/-dx; } else if(dx>0) { a=(n-x)/dx; } if(dy<0) { b=(y-1)/-dy; } else if(dy>0) { b=(m-y)/dy; } if(dx==0||dy==0) { t=dx==0?b:a; } else t=min(a,b); //cout<<t<<" "; x=x+dx*t; y=y+dy*t; s+=t; } cout<<s<<endl; }
C - Pocket Book
题意:给出n个字符串,每个字符串长度为m,每两串的前k(1=<k<=m)个字符可以进行交换,求有多少种不同的字符串。
题解:找规律,可以发现每列不同字符的个数相乘,即为最终结果。
代码:
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; char s[110][110]; for(int i=0;i<n;i++) { scanf("%s",&s[i]); //puts(s[i]); } long long ct=1,w; int b[1000]; for(int j=0;j<m;j++) { memset(b,0,sizeof(b)); w=0; for(int i=0;i<n;i++) { if(b[s[i][j]-'A']==0) { ++w; b[s[i][j]-'A']=1; } } ct=ct*w; ct%=1000000007; //cout<<w<<endl; } printf("%lld\n",ct); }

浙公网安备 33010602011771号