2017計蒜客第二場(AB)

A :


百度年會盛況空前,每個部門的年會活動也是非常有趣。某部門的年會中進行了一個有趣的遊戲:一張方桌上有四邊,每邊可以坐一人,每人面前擺放一排長方形木塊。我們一次給四邊標號,分別爲玩家 1、2、3、4(詳見下圖)。

玩家 1 擲出兩個骰子,其點數分別爲 x, y(1 \le x, y \le 6)x,y(1x,y6),則從玩家 1 開始按照逆時針(玩家 1、2、3、4)的順序,數到 x+yx+y 時不妨記爲玩家 c,那麼從玩家 c 面前順時針方向第 min(x, y) + 1min(x,y)+1 個木塊開始,按照玩家 1、2、3、4 的順序,每位玩家依次拿走連續的兩個木塊,循環三次,也就是說每位玩家最終應該有 66 個木塊。

注意:按照順時針方向拿走木塊,任何時候(包括拿第一個木塊的時候),如果某一邊的木塊不夠拿了,則繼續拿順時針方向下一個玩家的第一個木塊。

舉個例子,玩家 1 擲骰子點數爲 3,53,5,那麼應該從玩家 4 順時針第 44 塊木塊開始。依次用藍色、綠色、紅色、紫色分別代表玩家 1、2、3、4 拿到的木塊,如下圖所示:

分別用 num_1, num_2, num_3, num_4num1,num2,num3,num4 表示玩家 1/2/3/41/2/3/4 面前木塊的數量。在這些木塊中有兩個 幸運木塊,它們 在同一個玩家面前且相鄰。如果 同時拿走這兩個幸運木塊,就可以拿走年會的終極大獎。

現在輪到 玩家 1 擲骰子,他希望拿走終極大獎,你能幫他算出一共有多少種擲骰子的組合能使得 玩家 1 贏得終極大獎麼?不考慮骰子之間的順序,即 3,43,4 和 4,34,3 被認爲是同一種骰子組合。

輸入格式

第一行輸入 num_1, num_2, num_3, num_4num1,num2,num3,num4 (1 \le num_i < 52,(1numi<52, \sum_{i=1}^4num_i=54)i=14numi=54),依次表示 1/2/3/41/2/3/4 玩家面前擺放的木塊數。第二行輸入兩個整數 k(1 \le k \le 4),k(1k4), d(1 \le d < num_k)d(1d<numk),表示玩家 kk 面前順時針數第 dd 和 d+1d+1 位置上的木塊是幸運木塊(從 11 開始計數)。

輸出格式

輸出一行,表示 玩家 1 能夠贏得終極大獎的骰子組合的數目。

樣例說明

對於樣例,用紅色標識出了幸運木塊的位置。對應的玩家 1 擲骰子的方案有三種,分別是 (1, 1)(1,1)(1, 5)(1,5)(3, 6)(3,6)

樣例輸入

10 14 15 15
1 4

樣例輸出

3


題目大意:


四個人如圖,每個人前面有numi快木塊,先給出一組篩子的數字組(x,y)然後從第一個玩家開始逆時針數x+y次

停在c然後從c的第min(x,y)+1快木塊順時針開始1,2,3,4依次取兩塊,循環三次,每個人取6塊,總共去24塊

現在給你兩塊相鄰的幸運木塊位於第k個人前面的第d塊和第d+1塊,問你玩家1能取得這兩塊幸運木塊的擲篩子

的種類,不考慮順序


如題.....


題目思路:


因爲篩子的範圍爲1-6,所以考慮枚舉所有組合,對於每種組合,我們用兩個變量記錄當前位於第i個玩家第j個木塊

然後循環三次每次j+8,判斷i和j是否等於輸入的k和d這裏需要處理j是否小於numi,然後就是這裏是順時針移動


AC代碼:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int k,d;
    int num[5];    //四個玩家的木塊數
    int ans = 0;
    cin>>num[1]>>num[2]>>num[3]>>num[4]>>k>>d;
    for(int i=1;i<6;i++)
    {
        for(int j=i;j<=6;j++)
        {
            int ij = (i+j)%4;      //當前位於第ij個玩家
            if(ij==0)ij = 4;       //餘數爲0就是4
            int cnt = 3;
            int kk = min(i,j)+1;    //第ij個玩家的第kk的木塊
            while(cnt--)
            {
                while(kk>num[ij])      //處理kk>num[ij]的情況
                {
                    kk-=num[ij];
                    ij--;
                    if(ij==0)ij = 4;
                }
                if(ij==k&&kk==d)        //找到答案
                {
                    ans++;
                    break;
                }
                kk+=8;                   //每趟循環kk+8,因爲有四個人,每個人取兩個
            }
        }
    }
    cout<<ans<<endl;

    return 0;
}


B:

今年,百度的科學計算器進行了重大更新,可以計算更爲複雜的表達式了。

定義表達式中存在加減運算、括號、函數調用、強制類型轉換這幾種運算。其中數值的類型有整型與浮點型兩種。並且,

  • 整型與整型加減運算的結果爲整型;
  • 整型與浮點型加減運算結果爲浮點型;
  • 浮點型與浮點型加減運算結果爲浮點型。

強制類型轉換符 包括int(x)float(x),其中float(x)運算符可以將數值x的類型強制轉爲浮點型,int(x)運算符可以將數值x的類型強制轉爲整型。對於浮點型轉整型,採用截尾法,例如:int(1.6)=1int(-1.6)=-1等等。

例如,

  • int(10.9999)=10
  • float(10)=10.000000
  • int(10.9999)+float(1)=11.000000
  • int(1.0)+(100-40)=61

除此以外,還可以定義一系列函數,形如:

  • fun(x,y)=x+y+fun2(y)
  • fun2(x)=fun3()+int(x)
  • fun3()=61

函數的變量名和函數名均由一個或多個大小寫字母以及數字組成,並且由大小寫字母開頭。保證:變量名與函數名不爲intfloat;同一函數的不同參數的參數名互不相同;函數名互不相同。函數參數不超過兩個,函數之間可能存在相互調用關係,相互調用傳參時,各個參數保證均爲單一變量(既不是表達式也不是數字常量)。例如f1(x,y)=f2(y,x)+f3(x)+f4()是合法的,而f(x)=f2(x+x)+f3(61)是不合法的(因爲函數相互調用時參數不爲表達式或數字常量)。

對於給定表達式,百度的科學計算器需要算出該表達式的結果。

輸入格式

第一行輸入一個整數 n (0 \le n \le 1000)n(0n1000),表示有 nn 個函數。

接下來一共輸入 n+1n+1 行,對於前 nn 行,每行一個字符串,分別代表 nn 個函數,每個函數長度均不超過 5050 個字符,字符串中只包含加號+、減號-、括號()、數字常量、強制類型轉換以及函數調用。輸入數據保證所有表達式合法,表達式中沒有空格

最後一行爲一個表達式,表示需要求解的表達式,表達式長度不超過 10001000,並且這一表達式中出現函數調用的次數不超過 33 次。

輸入數據保證數字常量以及計算過程中數值絕對值均不超過 10^{12}1012,對於浮點型數值常量,保證小數點後不超過 66位。

輸入數據保證求解表達式及函數表達式出現的數字常量均爲非負數,但計算中間結果不一定非負。

對於簡單版本:n=0n=0,在滿足題意前提下,求解表達式中不存在強制類型轉換int()float()及函數調用;

對於中等版本:n \le 3n3,在滿足題意前提下,函數之間不存在相互調用的情況。函數的參數數量均爲 11

對於困難版本:滿足上述題意中的條件,沒有額外的限制。

輸出格式

輸出爲一行,即表達式結果,對於浮點型結果,保留到小數點後 66 位。對於表達式無法求解的情況(例如循環調用),給出No Answer

樣例輸入1

0
5.0-(4-5.1)

樣例輸出1

6.100000

樣例輸入2

3
func1(x)=x+1
func2(y)=y+1
func3(z)=z+int(1.9)
func1(1)+func2(1)+func3(1)

樣例輸出2

6

樣例輸入3

2
Haha(x)=Haha1(x)
Haha1(a)=Haha(a)
Haha(61)

樣例輸出3

No Answer

題目大意:

對於簡單版本函數爲0,就是計算含有+,-,(),數字的表達式,如果沒有浮點數就輸出整數否則輸出六位浮點數


題目思路:

這個可以用棧或者直接循環求解記錄括號的情況或是其他方法都可以,這裏是直接循環求解


首先對於數字,我們可以先求出整數部分和小數部分的值(如果有)全部都是double,然後用個op標記-(的個數

op1記錄是否有-數字,所以對於每個數如果op%2==0,然後考慮op1,有就是-沒有就是+  ,如果op%2==1則相反

然後用個數組記錄每個(,如果是+(則存0否則存1,對於每個),數組cnt--,如果出的是1,則op--

這裏其實就是記錄-的個數,還是看代碼吧.....代碼有點醜....輕噴.....


AC代碼:


#include<bits/stdc++.h>
using namespace std;
char s[100000];
int kh[1000];
int n,len,flag;
int op,op1,cnt;
double ans;
int main()
{
    scanf("%d%s",&n,s);
    len = strlen(s);
    ans = 0,flag = 0;   
    cnt = 0;
    op =op1 = 0;
    for(int i=0;i<len;i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            double x = 0;  //整數部分
            double y =0;    //小數部分
            while(i<len&&s[i]>='0'&&s[i]<='9')
            {
                y = y*10+s[i]-'0';
                i++;
            }
            x+=y;
            y = 0;
            if(s[i]=='.')
            {
                flag = 1;
                i++;
                double xx = 1;
                while(i<len&&s[i]>='0'&&s[i]<='9')
                {
                    y = y*10+s[i]-'0';
                    xx*=10.0;
                    i++;
                }
                i--;
                x+=y/xx;
            }
            else i--;

            if(op%2==0)    //如題解
            {
                if(op1)
                {
                    ans-=x;
                    op1 = 0;
                }
                else ans+=x;

            }
            else
            {
                if(op1)
                {
                    ans+=x;
                    op1 = 0;
                }
                else ans-=x;
            }

        }
        else if(s[i]=='-'||s[i]=='+')
        {
            if(s[i+1]=='(')
            {
                if(s[i]=='-')
                {
                    op++;
                    kh[cnt++]=1;
                }
                else kh[cnt++]=0;
                i++;

            }
            else
            {
                if(s[i]=='-')
                    op1 = 1;
            }
        }
        else if(s[i]==')')
        {
            if(kh[--cnt]==1)op--;
        }
    }
    if(flag)printf("%.6lf\n",ans);
    else printf("%.0lf\n",ans);
    return 0;
}










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