【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;
}
}
查看9道真题和解析