Wannafly挑战赛6

https://www.nowcoder.com/acm/contest/37#question
A
给定n组数,(1<=n<=1e5),每组两个数,a,b,求两个数范围内的 平方数有多少。(0<=a<=b<=1e9).
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
思路:sqrt(n)向下取整就是,但是左界需要-1。但是还是wa了好多发。没有特判0qwq

    #include <bits/stdc++.h>
using namespace std;
const int maxn=1e9;
typedef int ll;
int main(){
    int m,a,b;
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        scanf("%d%d",&a,&b);
        if(a!=0) {a--;

        printf("%d\n",(ll)floor(sqrt(b*1.0))-(ll)floor(sqrt(a*1.0)));}
        else
         printf("%d\n",(ll)floor(sqrt(b*1.0))+1);
    }
return 0;
}

B
题目描述

你在打比赛,这场比赛总共有12个题

对于第i个题,你的队伍有a[i]的机率解决她

如果解决不了她呢?

由于所有人讨论的都很大声

所以你有b[i]的概率从左边那个队那里听会这个题的做法

有c[i]的概率从右边那个队那里听会这个题的做法

请问最终你们队伍解出0-12题的概率分别是多少
输入描述:

第一行12个数表示a[1] -> a[12]
第二行12个数表示b[1] -> b[12]
第三行12个数表示c[1] -> c[12]

输出描述:

输出13行,第i行表示解出i-1题的概率
保留6位小数

输入

0.20 0.30 0.37 0.40 0.45 0.50 0.57 0.60 0.75 0.76 0.77 0.83
0.85 0.88 0.90 0.94 0.100 0.104 0.105 0.107 0.115 0.120 0.122 0.125
0.128 0.130 0.134 0.140 0.149 0.150 0.152 0.155 0.170 0.183 0.203 0.240

输出

0.000000
0.000000
0.000000
0.000011
0.000160
0.001508
0.009620
0.041938
0.124153
0.243773
0.301960
0.212453
0.064424
看懂题了就好办了。 作出i题,i是题的数目。。
可以很方便的求出 做不出i题的概率。 减一下就是做出来的。直接算太麻烦。 然后dfs,枚举情况,我写的还是比较暴力的。因为数据范围小嘛

#include <bits/stdc++.h>
using namespace std;
const int maxn=20;
vector<double>q[20];
double a[maxn];
double b[maxn];
double c[maxn];
bool v[maxn];
double num1[maxn];
double num2[maxn];
void dfs(int u,double sum2,int siz){
     if(u==13){
        /*for(int i=1;i<=12;i++)
            if(!v[i])
            sum2=sum2*num2[i];*/
        q[siz].push_back(sum2);
        return ;

     }
     v[u]=true;
     dfs(u+1,sum2*num1[u],siz+1);
     v[u]=false;
     dfs(u+1,sum2*num2[u],siz);
     return ;
}
int main()
{  //freopen("/home/wjz/yy.txt","r",stdin);
 //cout<<"??"<<endl;
for(int i=1;i<=12;i++){
        scanf("%lf",&a[i]);
    }
    //cout<<0<<endl;

    for(int i=1;i<=12;i++){
        scanf("%lf",&b[i]);
    }

    for(int i=1;i<=12;i++){
        scanf("%lf",&c[i]);
    }
    for(int i=1;i<=12;i++){
        num2[i]=(1-a[i])*(1-b[i])*(1-c[i]);
        num1[i]=1.0-num2[i];
    }
    memset(v,false,sizeof(v));
    dfs(1,1.0,0);
    for(int j=0;j<=12;j++)
    {    double sum=0;
       for(int i=0;i<q[j].size();i++)
           sum+=q[j][i];
       printf("%.6f\n",sum);
     }
    return 0;
}

C 逆序对
题目描述
求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i<j),则ai=1,aj=0。
答案对1e9+7取模。

输入描述:

输入一个n。

输出描述:

输出答案对1e9+7取模

示例1
输入

3

输出

6

每位计算。大佬告诉我找规律,找了好久没找到。1e18怎么能找通项呢。
这里写图片描述

#include <bits/stdc++.h>
using namespace std;
/*  这道题运用了组合数学的范畴。
  关键是推出公式,然后利用矩阵快速幂求解。
   范围是 1e18,求出个递推公式干啥子哦
*/
typedef long long ll;
const ll mod =1e9+7;
ll pow1(ll s,ll m){
   ll k=s%mod;
   ll sum=1;
   while(m){
      if(m&1)
      sum=(sum%mod*k)%mod;
       m>>=1;
       k=(k*k)%mod;
    }
  return sum%mod;
}
int main()
{    ll m;
     while(~scanf("%lld",&m)){
     //cout<<pow1(2,m)<<"???"<<endl;
     if(!m)
      puts("0");
     else if(m==1){
        puts("0");
     }
     else if(m==2){
         puts("1");
     }
     else
     printf("%lld\n",((m%mod*((m-1)%mod)+mod)%mod*pow1(2,m-3)%mod+mod)%mod);


}



    return 0;
}

E:双拆分数
题目描述
对于一个数字串 s,若能找到一种将其分成左右两个非空部分 s1,s2 的方案,使得:
1、s1,s2 均无前导零
2、存在两个正整数 a,b,使得 b 整除 a,且 a/b=s1, a*b=s2
那么我们记这是一个合法的分法。特别地,如果一个串有两个或更多个不同的合法的分法,那么我们称这个数字串是双拆分数字串。
给定一个 n,要求构造一个长度恰为 n 的双拆分数字串。如果无解,输出 -1。

输入描述:

输入仅一行一个正整数 n(1 <= n <= 300)。

输出描述:

仅一行一个数字串或者 -1。

示例1
输入

8

输出

24419764

思路:完全没思路,太弱了,构造题
题解:当长度小于等于3,肯定不存在,因为s1s2的顺序是固定的不能对称。
求一个长度为4和为5的, 其他情况加两个0。。

#include <bits/stdc++.h>
using namespace std;
/* 构造。
   当小于3的时候肯定是不可以的。
   构造一个 4的和5的,
   然后添0就行
   思路好巧妙啊。
*/
string a="1144";
string b="16400";
int m;
int main()
{   scanf("%d",&m);
    if(m<=3){
       puts("-1");
    }
    else if(m&1){
        cout<<b;
        for(int i=1;i<=(m-5)/2;i++){
           cout<<"00";
        }
        cout<<endl;
    }
    else {
     cout<<a;
        for(int i=1;i<=(m-4)/2;i++){
           cout<<"00";
        }
        cout<<endl;

    }



    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章