码迷,mamicode.com
首页 > 其他好文 > 详细

2017.10.5 QBXT 模拟赛

时间:2017-10-10 18:57:53      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:ring   second   money   stdin   ace   div   枚举   mil   iter   

题目链接

T1

  从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和。最后如果仍没找到最小的解,输出所有数的和+1

 

 

 

技术分享
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;

int n;
int a[100005];
int main()
{
     freopen("lost.in","r",stdin);
     freopen("lost.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    LL sum = 0;
    sort(a+1,a+n+1);
    bool flag =0;
    for(int i=1;i<=n;i++)
{
        if(a[i]>sum+1)
{
            printf("%lld\n",sum+1);
            flag = 1;
            break;
        }
else sum+=a[i];
    }
    if(!flag) printf("%lld\n",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\n",k*2-1);
    else printf("%lld\n",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\n",ans[i]);
     fclose(stdout);
    return 0;
}
View Code

 

2017.10.5 QBXT 模拟赛

标签:ring   second   money   stdin   ace   div   枚举   mil   iter   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!