進駐洛谷之普及場

最近從同學那得知洛谷,然後開始進駐洛谷,來試圖進階,卡在原地不動太難受。不進反退更難受。看我這菜雞水平,只能打打普及場。弄完普及,再去嘗試提高吧。感覺普及對我都有點難度了。果然是自己水平太菜了。

 

簡單的模擬(關卡2-1)

        

P1003 鋪地毯

題目描述

爲了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角座標系的第一象限)鋪上一些矩形地毯。一共有 nn 張地毯,編號從 11 到nn。現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。

地毯鋪設完成後,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。

輸入格式

輸入共n+2n+2行

第一行,一個整數nn,表示總共有nn張地毯

接下來的nn行中,第 i+1i+1行表示編號ii的地毯的信息,包含四個正整數a ,b ,g ,ka,b,g,k ,每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的座標(a,b)(a,b)以及地毯在xx軸和yy軸方向的長度

第n+2n+2行包含兩個正整數xx和yy,表示所求的地面的點的座標(x,y)(x,y)

輸出格式

輸出共11行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-1−1

思路分析:

起初我想要定個數組模擬一遍,發現自己果然是頭腦簡單,既卡內存又卡時間。其實有個很取巧的方法,把信息先存起來,不去模擬作圖,然後倒序反推,看每條信息是否容括了那個點,因爲是取最上層的地毯,所以倒序推就好,找到就退出去就ok了。

#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[10005][5];
int main()
{
    //fin;
    // ios::sync_with_stdio(0);
    int n;
    cin >> n;
    fo(k, 1, n + 1)
    {
        fo(i, 1, 5)
           cin >>arr[k][i];
    }
    int x,y;
    cin >> x >> y;
    bool flag = false;
    foo(k, n, -1)
    {
        if (x >= arr[k][1] && x <= (arr[k][3]+arr[k][1]) && y >= arr[k][2] && y <= (arr[k][4]+arr[k][2]))
        {
            cout << k << endl;
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
        cout << "-1\n";
    }
}

 

P1067 多項式輸出

 

題目描述

一元nn次多項式可用如下的表達式表示:

f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0f(x)=an​xn+an−1​xn−1+⋯+a1​x+a0​,an​≠0

其中,a_ix^iai​xi稱爲ii次項,a_iai​ 稱爲ii次項的係數。給出一個一元多項式各項的次數和係數,請按照如下規定的格式要求輸出該多項式:

  1. 多項式中自變量爲xx,從左到右按照次數遞減順序給出多項式。

  2. 多項式中只包含係數不爲00的項。

  3. 如果多項式nn次項係數爲正,則多項式開頭不出現“+”號,如果多項式nn次項係數爲負,則多項式以“-”號開頭。

  4.  

對於不是最高次的項,以“+”號或者“-”號連接此項與前一項,分別表示此項係數爲正或者係數爲負。緊跟一個正整數,表示此項係數的絕對值(如果一個高於00次的項,其係數的絕對值爲11,則無需輸出 11)。如果xx的指數大於11,則接下來緊跟的指數部分的形式爲“x^bxb”,其中 bb爲 xx的指數;如果 xx的指數爲11,則接下來緊跟的指數部分形式爲“xx”;如果 xx 的指數爲00,則僅需輸出係數即可。

  1.  

多項式中,多項式的開頭、結尾不含多餘的空格。

輸入格式

輸入共有 22 行

第一行11 個整數,nn,表示一元多項式的次數。

第二行有 n+1n+1個整數,其中第ii個整數表示第n-i+1n−i+1 次項的係數,每兩個整數之間用空格隔開。

輸出格式

輸出共 11 行,按題目所述格式輸出多項式。

 

思路分析

這題卡了好多次,因爲一開始思路不是很清晰,就直接上手了,細節處理起來給我整懵了。建議沒有想好思路,不要下手。切勿邊敲邊想這類的細節題。

#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)
int arr[105];
int main()
{
    //fin;
    // ios::sync_with_stdio(0);
    int n;
    cin >> n;
    foo(i, n, -1)
    {
        cin >> arr[i];
    }
    foo(i, n, 0)
    {
        if (arr[i])
        {

            if (i == n ) //第一項
            {
                if (arr[i] == 1)
                cout<<"x^"<<i;
                else if(arr[i]==-1)
                    cout << "-x^" << i;
                else
                {
                    cout <<arr[i]<< "x^" << i;
                }
            }
            else if (i > 1)
            {
                if (arr[i] == 1)
                    cout << "+x^" << i;
                else if (arr[i] == -1)
                    cout << "-x^" << i;
                else{if(arr[i]>0)
                cout<<'+';
                    cout << arr[i] << "x^" << i;
                }
            }
            else if (i == 1)
            {
                if (arr[i]==1)
                    
                cout << '+'<< 'x';
                else if(arr[i]==-1)
                cout<<"-x";
                else
                {
                    if(arr[i]>0)
                    cout<<'+';
                    cout<<arr[i]<<"x";
                }
                
            }
        }
    }
    if (arr[0])
    {
        if (arr[0] > 0 && n != 0)
            cout << '+';
        cout << arr[0];
    }
}

 

P1540 機器翻譯

題目描述

這個翻譯軟件的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對於每個英文單詞,軟件會先在內存中查找這個單詞的中文含義,如果內存中有,軟件就會用它進行翻譯;如果內存中沒有,軟件就會在外存中的詞典內查找,查出單詞的中文含義然後翻譯,並將這個單詞和譯義放入內存,以備後續的查找和翻譯。

假設內存中有MM個單元,每單元能存放一個單詞和譯義。每當軟件將一個新單詞存入內存前,如果當前內存中已存入的單詞數不超過M-1M−1,軟件會將新單詞存入一個未使用的內存單元;若內存中已存入MM個單詞,軟件會清空最早進入內存的那個單詞,騰出單元來,存放新單詞。

假設一篇英語文章的長度爲NN個單詞。給定這篇待譯文章,翻譯軟件需要去外存查找多少次詞典?假設在翻譯開始前,內存中沒有任何單詞。

輸入格式

共22行。每行中兩個數之間用一個空格隔開。

第一行爲兩個正整數M,NM,N,代表內存容量和文章的長度。

第二行爲NN個非負整數,按照文章的順序,每個數(大小不超過10001000)代表一個英文單詞。文章中兩個單詞是同一個單詞,當且僅當它們對應的非負整數相同。

輸出格式

一個整數,爲軟件需要查詞典的次數。

輸入輸出樣例

輸入 #1

3 7
1 2 1 5 4 4 1

輸出 #1

5

說明/提示

每個測試點1s1s

對於10\%10%的數據有M=1,N≤5M=1,N≤5。

對於100\%100%的數據有0≤M≤100,0≤N≤10000≤M≤100,0≤N≤1000。

整個查字典過程如下:每行表示一個單詞的翻譯,冒號前爲本次翻譯後的內存狀況:

空:內存初始狀態爲空。

1.11:查找單詞1並調入內存。

2. 1 212:查找單詞22並調入內存。

3. 1 212:在內存中找到單詞11。

4. 1 2 5125:查找單詞55並調入內存。

5. 2 5 4254:查找單詞44並調入內存替代單詞11。

6.2 5 4254:在內存中找到單詞44。

7.5 4 1541:查找單詞1並調入內存替代單詞22。

共計查了55次詞典。

思路分析

這題還是比較簡單的,模擬一下隊列就好了。不過我寫的還是過於冗長了,有更節省時間和空間的思路。

有個地方不解的是,我數組如果開1005,就會wa掉第六個數據,開1010就好了。看大神的代碼也都只開到1005。

#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)


int main()
{
    //fin;
    // ios::sync_with_stdio(0);
    int m,n;
    int Myqueue[1010];
    int fir,back;
    fir=back=1;
    cin>>m>>n;
    int data;
    int num_check=0;
    fo(i,0,n)
    {
        cin>>data;
        bool flag=false;
        fo(k,fir,back+1)
        {
            if(Myqueue[k]==data)//找到單詞
           {flag=true; break;}
        }
        if(!flag)
        {
            num_check++;
            if(back-fir<m)// poor
            {
                Myqueue[back++]=data;
            }
            else //enough
            {
                fir++;
                Myqueue[back++]=data;
            }
            
        } 

        /*fo(i,fir,back)
        {
            cout<<Myqueue[i]<<' ';
        }
        cout<<fir<<"->"<<back<<endl;*/
    } 
    cout<<num_check<<endl;
    return 0;
}

P1328 生活大爆炸版石頭剪刀布

 

題目描述

石頭剪刀布是常見的猜拳遊戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一 樣,則不分勝負。在《生活大爆炸》第二季第8集中出現了一種石頭剪刀布的升級版遊戲。

升級版遊戲在傳統的石頭剪刀布遊戲的基礎上,增加了兩個新手勢:

斯波克:《星際迷航》主角之一。

蜥蜴人:《星際迷航》中的反面角色。

這五種手勢的勝負關係如表一所示,表中列出的是甲對乙的遊戲結果。

現在,小 A小 B嘗試玩這種升級版的猜拳遊戲。已知他們的出拳都是有周期性規律的,但週期長度不一定相等。例如:如果小A以“石頭-布-石頭-剪刀-蜥蜴人-斯波克”長度爲 66 的週期出拳,那麼他的出拳序列就是“石頭-布-石頭-剪刀-蜥蜴人-斯波克-石頭-布-石頭-剪刀-蜥蜴人-斯波克-......”,而如果小B以“剪刀-石頭-布-斯波克-蜥蜴人”長度爲 55 的週期出拳,那麼他出拳的序列就是“剪刀-石頭-布-斯波克-蜥蜴人-剪刀-石頭-布-斯波克-蜥蜴人-......”

已知小 A小 B 一共進行 NN 次猜拳。每一次贏的人得 11 分,輸的得 00 分;平局兩人都得 00 分。現請你統計 NN 次猜拳結束之後兩人的得分。

輸入格式

第一行包含三個整數:N,N_A,N_BN,NA​,NB​,分別表示共進行 NN 次猜拳、小 A出拳的週期長度,小 B 出拳的週期長度。數與數之間以一個空格分隔。

第二行包含 N_ANA​ 個整數,表示小 A出拳的規律,第三行包含 N_BNB​ 個整數,表示小 B 出拳的規律。其中,00 表示“剪刀”,11 表示“石頭”,22 表示“布”,33 表示“蜥蜴人”,44表示“斯波克”。數與數之間以一個空格分隔。

輸出格式

輸出一行,包含兩個整數,以一個空格分隔,分別表示小 A小 B的得分。

輸入輸出樣例

輸入 #1複製

10 5 6
0 1 2 3 4
0 3 4 2 1 0

輸出 #1複製

6 2

輸入 #2複製

9 5 5
0 1 2 3 4
1 0 3 2 4

輸出 #2複製

4 4

說明/提示

對於100\%100%的數據,0 < N \leq 200, 0 < N_A \leq 200, 0 < N_B \leq 2000<N≤200,0<NA​≤200,0<NB​≤200 。

 

思路分析

這題我起初是想要用函數判斷模擬一遍,寫到一半發現太麻煩了。就重新想了想。發現可以做一張得分表,在模擬一次就ok了

 

#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <string.h>
#include <stack>
#include <map>
#include<queue>
using namespace std;
#define ll long long
#define fo(i, a, b) for (int i = a; i < b; i++)
#define foo(i, a, b) for (int i = a; i > b; i--)
#define mst(a, b) memset(a, b, sizeof(a))
const ll maxn = 2e5 + 5;
#define fin freopen("in.txt", "r", stdin)

int sore[5][5]={{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}};
int main()
{
    int a[205],b[205];
    //fin;
    // ios::sync_with_stdio(0);
    int n,alen,blen;
    int asore,bsore;
    asore=bsore=0;
    cin>>n>>alen>>blen;
    fo(i,0,alen)
    cin>>a[i];
    fo(i,0,blen)
    cin>>b[i];
    fo(i,0,n)
    {
        if(sore[a[i%alen]][b[i%blen]])
        asore++;
        else if(a[i%alen]!=b[i%blen])
        bsore++;
    }
    cout<<asore<<' '<<bsore<<endl; 

    return 0;
}

 

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