比赛 |
NOIP水题争霸赛 |
评测结果 |
RRRRRRRRRR |
题目名称 |
博士的密码 |
最终得分 |
0 |
用户昵称 |
sarail |
运行时间 |
0.008 s |
代码语言 |
C++ |
内存使用 |
0.28 MiB |
提交时间 |
2018-02-11 21:36:39 |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=40;
vector<int> b,c,tmp;
int a[maxn];
int n,i,j,key,mid,cnt,p,x,bb,cc,ans,f;
void change(){
int x;tmp.clear() ;
for(int k=0;k<bb;k++){
for(int g=k+1;g<bb;g++){
x=b[k]+b[g];
if(x<mid)tmp.push_back(x);
else c.push_back(x);
if(x==mid&&f) cnt++;
}
}
b.clear();
for(int k=0;k<tmp.size();k++)
b.push_back(tmp[k]);
bb=b.size() ;cc=c.size();
}
int main(){
freopen("password1.in","r",stdin);
freopen("password1.out","w",stdout);
cin>>n>>key;
for(i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
mid=key/2;
if(2*mid==key)f=1;
else f=0;
ans=cnt=p=0;
b.clear() ;c.clear() ;
while(a[p]<mid+(f+1)%2){
b.push_back(a[p]);
p++;
}
for(i=p;i<n;i++){
if(a[i<key])c.push_back(a[i]);
if(a[i]==key)ans++;
if(a[i]==mid&&f)cnt++;
}
bb=b.size() ;cc=c.size();
while(bb>1){
for(i=0;i<bb;i++){
for(j=0;j<cc;j++){
x=b[i]+c[j];
if(x==key)ans++;
}
}
change();
}
if(b.size()==1){
x=b[0];
for(i=0;i<cc;i++){
if(x+c[i]==key)ans++;
}
}
if(f)ans+=cnt*(cnt-1)/2;
cout<<ans;
return 0;
}