Codeforces Beta Round #108 (Div2)-5/22补题

A - Marks

 链接:https://codeforces.com/problemset/problem/152/A

题意:

有n个学生共m门科目,给出每个学生每门成绩;

如果没有学生在这门课上得到更高的分数,则这个学生在某门课上表现最好;

如果有一个学科是他最擅长的,则这个个学生是成功的;求成功的学生数。 

思路:

用字符串数组将每个学生的各个科目成绩存储,求出每列即各科目最高的成绩,再判断某学生是否具有最高成绩即可。

ac代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int main(){
    int n,m,i,j,max,b[105]={0},shu=0;
    string a[105];
    map<int,int> mp;
    mp.clear();
    cin>>n>>m;
    for(i=0;i<n;i++){
        
            cin>>a[i];
    }
    for(j=0;j<m;j++){
        max=0;
        for(i=0;i<n;i++){
            if(a[i][j]>max){
                max=a[i][j];
            }
        }
        b[j]=max;
    }
    for(j=0;j<m;j++){
        for(i=0;i<n;i++){
            if(a[i][j]==b[j]){
                mp[i]++;
                if(mp[i]==1){
                    shu++;
                }
            }
        }
    }
    cout<<shu<<endl;
    return 0;
}
View Code

B - Steps

链接:https://codeforces.com/problemset/problem/152/B

题意:

在一个n*m的长方形场地上,Vasya的初始位置为(x,y),

给出k个向量,每个向量(dx,dy),(|dxi|, |dyi| ≤ 109, |dx| + |dy| ≥ 1),则移动一步位置为(x + dx, y + dy),

只要当前位置(1≤x‘≤n, 1≤y’≤m),则可以一直进行这个向量直至不符合要求,

求共可以走多少步。

思路:

临界判断问题,针对每一个方向向量,判断走多少步出界,依次针对每个向量判断其最大步数即可。

ac代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int main(){
    long long int n,m,i,x,y,k,a,b,shu=0,p,q,z;
    cin>>n>>m;
    cin>>x>>y;
    cin>>k;
    while(k--){
        cin>>a>>b;
        if(a>0){
            p=(n-x)/a;
        }
        else if(a==0){
            p=0;
        }
        else{
            p=(x-1)/abs(a);
        }
        if(b>0){
            q=(m-y)/b;
        }
        else if(b==0){
            q=0;
        }
        else{
            q=(y-1)/abs(b);
        }
        if(a==0){
            z=q;
        }
        else if(b==0){
            z=p;
        }
        else{
            z=min(p,q);    
        }
//        cout<<z<<"**"<<endl;
        x=x+z*a;
        y=y+z*b;
//        cout<<x<<"###"<<y<<endl;
        shu=shu+z;
    }
    cout<<shu<<endl;
    return 0;
}
View Code

C - Pocket Book

链接:https://codeforces.com/problemset/problem/152/C

题意:

给出n个长度为m的字符串,任意两个字符串可以交换前k个字符(k<=m),交换后字符串变成新的字符串,问最后能产生多少个不同的字符串。

思路:

组合排列问题,每个字符串的每一列都可以变成所有字符串的该列的字符,所以只要统计每一列有多少个不同的字符即可。

ac代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
int main(){
    long long int n,m,i,j,shu=1;
    string s[105];
    set<char> ss[105];
    cin>>n>>m;
    getchar();
    for(i=0;i<n;i++){
        cin>>s[i];
    }
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            ss[j].insert(s[i][j]);
        }
    }
    for(i=0;i<m;i++){
        shu=(shu*ss[i].size())%1000000007;
    }  
    cout<<shu<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/nanan/p/14803438.html