【D】划数

划数

https://ac.nowcoder.com/acm/contest/9986/D

根据题意,每俩个数字组合模11会产生一个新的数字
我当时的想法就是除了cnt以外的那个数字不算
剩下的按从小到大的顺序组合组到最后剩下的数字就是所求数字
这里用到了优先队列,代码简洁易懂,除了要处理一下出现cnt数字的情况,即除了所给的cnt还有其他相同数字
剩下的就没什么了
代码如下:

#include<bits/stdc++.h>
#define ll long long
#define up_b upper_bound
#define low_b lower_bound
#define m_p make_pair
#define mem(a) memset(a,0,sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define INF 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
priority_queue <int,vector<int>,greater<int> > q;
int num[200000];
int flag;
int n,cnt,vis;
ll read()
{
    ll x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9') {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}



int main()
{
    while(~scanf("%d %d",&n,&cnt))
    {
        rep(i,1,n) 
        {
            num[i]=read();
            if(num[i]!=cnt) q.push(num[i]);
            else
            {
                vis++;
                if(vis>1) q.push(num[i]); 
            }
        }
        while(q.size()>1)
        {
            rep(i,1,2)
            {
                flag+=q.top();
                q.pop();
            }
            flag=flag%11;
            q.push(flag);
            flag=0;
        }
        printf("%d\n",q.top());
        q.pop();
        vis=0;
    }
}



全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务