【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; } }