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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章