1. 程式人生 > 實用技巧 >2020牛客多校訓練第3場ABC

2020牛客多校訓練第3場ABC

題目來源:2020牛客暑期多校訓練營(第三場)A-Clam and Fish

題目連結:https://ac.nowcoder.com/acm/contest/5668/A

題目大意:有n個階段,每個階段可能是4種狀態的一種。

      1:沒魚沒飼料;

      2:沒魚有飼料;

      3:有魚沒飼料;

      4:有魚有飼料。

對於每個階段:

      我們可以用飼料做魚餌,

      或者用魚餌釣魚,

      或者在該狀態有魚的時候直接把魚抓起來。

解題思路:在3.4狀態是,我們必然是直接把有的魚抓起來就可以了。

在第1種狀態,如果我們手裡有魚餌就可以釣一條魚。

在第3種狀態,如果後面的1的數量比當前存的魚餌量多或等於,就繼續存魚餌,反之釣魚。

*/

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int t;
    scanf("%d",&t);
    for(int ii=1;ii<=t;ii++){
        int n;
        scanf("%d",&n);
        string s;
        cin>>s;
        int s1[n+9],s0[n+9];
        s1[n]=s0[n]=0;
        for(int i=n-1;i>=0;i--){
            if(s[i]=='0')s0[i]=s0[i+1]+1;
            else s0[i]=s0[i+1];
        }
        int food=0,fish=0;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                if(food>=1)food--,fish++;
            }
            else if(s[i]=='1'){
                if(s0[i]>=food)food++;
                else {
                    if(food>=1)food--,fish++;
                    else food++;
                }
            }
            else fish++;
        }
        printf("%d\n",fish);
    }
    return 0;
}

  

/*

題目來源:2020牛客暑期多校訓練營(第三場)B-Classical String Problem

題目連結:https://ac.nowcoder.com/acm/contest/5668/B

題目大意:給你一個字串,n次操作。

m表示把前面k個字元挪後面,或把後面-k(k為負數)個挪前面。

a表示詢問,第k個字母是什麼。

解題思路:首位相連,看成一個環以後,所謂的挪動其實就是改動把那個字母看成頭,然後這題就沒了。

*/

#include<bits/stdc++.h>
using namespace std;
  
int main()
{
    string s;
    cin>>s;
    s=" "+s;
    int l=s.size()-1;s[0]=s[l];
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++){
        getchar();
        char c;
        int x;
        scanf("%c%d",&c,&x);
        if(x<0)x+=l;
        if(c=='A')printf("%c\n",s[(sum+x)%l]);
        else sum=(sum%l+x)%l;
    }
    return 0;
}

  

/*

題目來源:2020牛客暑期多校訓練營(第三場)C-Operation Love

題目連結:https://ac.nowcoder.com/acm/contest/5668/C

題目大意:給出左手和右手的二維座標表示法。可能會旋轉平移,逆時針或順時針給出,不會改變大小,問是左手還是右手。

解題思路:先確定是逆時針還是順時針。然後找出長度為10的那條邊,看它接下來的邊的長度就可以確定是左手還是右手了。

在判斷是否相等的過程中需要注意精度問題,有時候結果可能是個小數,需要四捨五入到int型進行判斷

*/

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

struct point
{
    double x,y;
    point (){}
    point (double x,double y):x(x),y(y){}
    point operator + (point b){return point (x+b.x,y+b.y);}
    point operator - (point b){return point (x-b.x,y-b.y);}
 
};typedef point Vector;
double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
point p[24];
double parea(int n)
{
    double area=0;
    for(int i=0;i<n;i++)
    {
        area+=Cross(p[i],p[(i+1)%n]);
    }
    return area/2;
}
int dis(point a,point b){
    return (int)(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))+0.5);
}
int main()
{
    int n;
    cin>>n;
    while(n--){
        double s;
        for(int i=0;i<20;i++){
            cin>>p[i].x>>p[i].y;
        }
        p[21]=p[1];
        if(parea(20)<0){
            int i;
            for( i=0;i<20;i++){
                if(dis(p[i],p[(i+1)%20])==9)break;
            }
            if(dis(p[(i+1)%20],p[(i+2)%20])==6)cout<<"right"<<endl;
            else cout<<"left"<<endl;
        }
        else{
            int i;
            for( i=0;i<20;i++){
                if(dis(p[i],p[(i+1)%20])==9) break;
            }
            if(dis(p[(i+1)%20],p[(i+2)%20])==6)cout<<"left"<<endl;
            else cout<<"right"<<endl;
        }
    }
    return 0;
}