2017.10.5 QBXT 模拟赛
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017.10.5 QBXT 模拟赛相关的知识,希望对你有一定的参考价值。
T1
从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和。最后如果仍没找到最小的解,输出所有数的和+1
#include <algorithm> #include <cstdio> #define N 100005 typedef long long LL; using namespace std; int n,a[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); sort(a+1,a+1+n); LL sum=0; for(int i=1;i<=n;++i) { if(a[i]>sum+1) { printf("%lld\\n",sum+1); return 0; } else sum+=a[i]; } printf("%lld\\n",sum+1); return 0; }
T2
规律题
#include <cstdio> #include <cmath> long long n; int main() { freopen("div.in","r",stdin); freopen("div.out","w",stdout); scanf("%lld",&n); long long k=sqrt(n); if(k==n/k) printf("%lld\\n",k*2-1); else printf("%lld\\n",k*2); fclose(stdin); fclose(stdout); return 0; }
T3
meet in the middle
#include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; int tt; int n,m; int v[35]; double p[35]; double ans[35]; vector<pair<int,double> > sta[35]; int main() { freopen("diamond.in","r",stdin); freopen("diamond.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1,x;i<=n;i++) { scanf("%d%d",&v[i],&x); p[i]=x/100.; } int an=(n/2.5)+1; int bn=n-an; for(int st=0;st<1<<bn;st++) { double nowp=1; int cnt=0,money=0; for(int i=0;i<bn;i++) { if((st>>i)&1) { money+=v[n-i]; nowp*=p[n-i]; } else { cnt++; nowp*=(1-p[n-i]); } } sta[cnt].push_back(make_pair(money,nowp)); } for(int i=0;i<=n;i++) { sort(sta[i].begin(),sta[i].end()); for(int j=1;j<sta[i].size();j++) sta[i][j].second+=sta[i][j-1].second; } for(int st=0;st<1<<an;st++) { double nowp=1; int cnt=0,money=0; for(int i=0;i<an;i++) { if((st>>i)&1) { money+=v[i+1]; nowp*=p[i+1]; } else { cnt++; nowp*=(1-p[i+1]); } } for(int i=0;i<=bn;i++) { // now d =cnt+i int L = m-money; vector<pair<int,double> >::iterator it = lower_bound(sta[i].begin(),sta[i].end(),make_pair(L,-1.)); double tmp = sta[i].back().second; if(it!= sta[i].begin()) { it--; tmp-=it->second; } ans[cnt+i] += tmp*nowp; } } for(int i=0;i<=n;i++) printf("%.3f\\n",ans[i]); fclose(stdout); return 0; }
以上是关于2017.10.5 QBXT 模拟赛的主要内容,如果未能解决你的问题,请参考以下文章