zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/nanan/p/14803438.html
Copyright © 2011-2022 走看看