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
",sum+1);
            return 0;
        }
        else sum+=a[i];
    }
    printf("%lld
",sum+1);
    return 0;
}
View Code

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
",k*2-1);
    else printf("%lld
",k*2);
    fclose(stdin); fclose(stdout);
    return 0;
}
View Code

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
",ans[i]);
     fclose(stdout);
    return 0;
}
View Code

原文地址:https://www.cnblogs.com/ruojisun/p/7646912.html