zoukankan      html  css  js  c++  java
  • 补题—Codeforces Round #346 (Div. 2) _智商欠费系列

    这次的题目相对容易 但是智商依旧不够用

    原因有三点 1.英文水平堪忧 2 逻辑不严密 3 细节掌握不够好

    传送门

    http://codeforces.com/contest/659

    A 题目大意 圆环上有n个点 人从a位置出发 走b步 正负代表方向

    (a+b%n+n)%n 需要特判 避免走到 0位置

    观察数据范围 只需要(100*n+a+b-1)%n+1 还省去了特判

    B 题目大意 有n个人的数据  m个地区 每个地区最少参赛2人 晋级2人

    出线则输出 需要加赛 如第二个人和第三个人成绩一样  就输出?

    #include<cstdio>
    #include<map>
    //#include<bits/stdc++.h>
    #include<vector>
    #include<stack>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<cstdlib> 
    #include<climits>
    #define PI acos(-1.0)
    #define INF 0x3fffffff
    using namespace std;
    typedef long long ll;
    typedef __int64 int64;
    const ll mood=1e9+7;
    const int64 Mod=998244353;
    const double eps=1e-9;
    const int N=1e3+10;
    const int MAXN=200000;
    typedef int rl; 
    inline void r(rl&num){
        num=0;rl f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    typedef pair<string,int> psi;
    bool cmp(psi a,psi b)
    {
        return a.second>b.second;
    } 
    int main()
    {
        vector<psi>v[10001];
        int t;
        psi tem;
        int n,m;
        r(n),r(m);
        for(int i=0;i<n;i++)
        {
            cin>>tem.first;
            r(t);r(tem.second);
            v[t].push_back(tem);
        }
        for(int i=1;i<=m;++i)
        {
            if(v[i].size()<2)
            {
                putchar('?'); 
            }
            else{
                sort(v[i].begin(),v[i].end(),cmp);
                if(v[i][1].second==v[i][2].second)
                {
                    putchar('?'); 
                }
                else{
                    cout<<v[i][0].first<<' '<<v[i][1].first; 
                }
            }
            putchar('
    ');
        }
        return 0;
    }
    错误代码

    错误原因 未在判断第二个人和第三个成绩是否一样前判断 人数是否大于2 

    在(——人数等2 第二个人成绩为0的时候 第三个人不存在默认为0 则相等 输出?)因此wa

    改完AC

    #include<cstdio>
    #include<map>
    //#include<bits/stdc++.h>
    #include<vector>
    #include<stack>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<cstdlib> 
    #include<climits>
    #define PI acos(-1.0)
    #define INF 0x3fffffff
    using namespace std;
    typedef long long ll;
    typedef __int64 int64;
    const ll mood=1e9+7;
    const int64 Mod=998244353;
    const double eps=1e-9;
    const int N=1e3+10;
    const int MAXN=1e4+10;
    typedef int rl; 
    inline void r(rl&num){
        num=0;rl f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    typedef pair<string,int> psi;
    bool cmp(psi a,psi b)
    {
    //    if(a.second==b.second) return a.first<b.first;
        return a.second>b.second;
    } 
    int main()
    {
        vector<psi>v[MAXN];
        int t;
        psi tem;
        int n,m;
        r(n),r(m);
        for(int i=0;i<n;i++)
        {
            cin>>tem.first;
            r(t);r(tem.second);
            v[t].push_back(tem);
        }
        for(int i=1;i<=m;++i)
        {
    
            sort(v[i].begin(),v[i].end(),cmp);
            if(v[i].size()>2&&v[i][1].second==v[i][2].second)
            {
                    putchar('?'); 
            }
            else{
                cout<<v[i][0].first<<' '<<v[i][1].first; 
            }
            putchar('
    ');
        }
        return 0;
    }
    B——AC

    这样写 还是不够好 我们注意到pair默认是先排一维从小到大然后二维依次

    在输出的时候用pis 成绩*-1输入 ,成绩*-1从小到大即原成绩从大到小

    就可以了

    #include<bits/stdc++.h>
    using namespace std;
    const int MAX=1e5+9;
    int n,m,r,p;
    vector<pair<int,string> >  mp[MAX];
    string s;
    int main()
    {
        cin>>n>>m;
        for (int i=0;i<n;i++)
            cin>>s>>r>>p,mp[r].push_back({-p,s});
        for (int i=1;i<=m;i++)
        {
            sort(mp[i].begin(),mp[i].end());
            if (mp[i].size()>2 && mp[i][1].first==mp[i][2].first)
                cout<<"?
    ";
            else
                cout<<mp[i][0].second<<" "<<mp[i][1].second<<'
    ';
        }
    }
    某人简短AC码

    C 题目大意 找1-n序列中 未标记的和<m

    开始用set瞎搞错误 姿势错误

    可以开个vis数组 没意思 其实开vis是有问题的 可惜他的数据弱233

    于是去学习了一下set的姿势

    把存在的的插入 以后的扫描只有一趟 所以不用再次插入

  • 相关阅读:
    转 Unicdoe【真正的完整码表】对照表
    golang中,unsafe.sizeof到底是干嘛的?
    转载 Golang []byte与string转换的一个误区
    python异常处理--try except else raise finally
    微信静默授权增加浏览器历史记录导致跳转死循环的解决方案
    package-lock.json,我们应该了解
    webpack实现静态资源缓存的那点事
    webpack+babel项目在IE下报Promise未定义错误引出的思考
    CORS预检请求详谈
    谈谈form-data请求格式
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/5341156.html
Copyright © 2011-2022 走看看