1. 程式人生 > >Wannafly模擬賽3

Wannafly模擬賽3

正在 既然 類型 延伸 sin 概率 理論 for tel

喜歡想飛啊,畢竟這裏的題目還都算挺好的中文題,不過做英文題久了還是感覺英文題更好理解一點

反蝴蝶效應 時間限制:1秒 空間限制:65536K

題目描述

一只南美洲亞馬孫河流域熱帶雨林中的蝴蝶,偶爾扇動幾下翅膀,可
以在兩周以後引起美國德克薩斯州的一場龍卷風。――蝴蝶效應
由於這個理論的存在,大多數人認為將未來的事物送回過去將會引發
嚴重的時間悖論,但事實上還存在另外一套理論。
自然會對這類不和諧的蝴蝶效應做出調整,具體地來說就是觸發一些
小概率的惡性事件來抹殺穿越者來消除其對未來的影響。
雖然聽上去很荒誕,但Alicebell決定去驗證這一假說,她將按1 ~ n的 順序依次到訪過去的n個時間點。 這n個時間點各有一個能源參數A??,即到達這個時間點時,身上必須 保證有A??單位的能量,那之後將會消耗掉一單位的能量。 Alicebell想知道依次到訪這n個時間點,最初需要攜帶至少多少能量。

輸入描述:

第一行,一個正整數n。 第二行,n個正整數A??。

輸出描述:

一行,一個正整數,最初需要攜帶能量下限。
示例1

輸入

5
1 2 5 4 2

輸出

7

備註:

對於30%的數據,n,A?? ≤ 5。
對於50%的數據,n,A?? ≤ 100。 對於100%的數據,n ≤ 105,1 ≤ A?? ≤ 109。 上來就是秒A,做了3min交了wa,我真是個sb,只要找到權值加上當前貢獻的和最大的那個就好的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    
int n,f=0,x; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&x); if(f-(i+1+x)<0) f=x+i; } printf("%d",f); return 0; }
貝倫卡斯泰露 時間限制:1秒 空間限制:131072K

題目描述

貝倫卡斯泰露,某種程度上也可以稱為古手梨花,能夠創造幾率近乎
為0的奇跡,通過無限輪回成功打破了世界線收束理論。
和某民科學者不同,貝倫並不在意世界線收束的那套理論,作為奇跡
之魔女,貝倫的愛好只在於品茶。
作為品茶的消遣,貝倫正在解一道簡單的謎題。
給出一個長度為n的數列A??,問是否能將這個數列分解為兩個長度 為n/2的子序列,滿足 ? 兩個子序列不互相重疊。
? 兩個子序列中的數要完全一樣,{1, 2} = {1, 2},{1, 2} ≠ {2, 1}。

輸入描述:

第一行,一個正整數T,表示數據組數。 接下來T組數據,每組數據的第一行,一個正整數n,第二行??個正整數A??。

輸出描述:

每組數據輸出一行,如果可以完成,輸出Frederica Bernkastel,否則輸出Furude Rika。
示例1

輸入

3
4
1 1 2 2
6
1 2 3 4 5 6
4
1 2 2 1

輸出

Frederica Bernkastel
Furude Rika
Furude Rika

備註:

對於30%的數據,?? ≤ 16。
對於另20%的數據,?? = 1。
對於另20%的數據,?? = 2。
對於100%的數據,?? ≤ 5,1 ≤ ???? ≤ ?? ≤ 40,保證??為偶數。

這個正確的做法應該是hash之後再匹配,用隊列直接模擬是不嚴謹的,所以反著做一次竟然對了

加入有四個相同的比較強的數據,大概還是要跪

#include<bits/stdc++.h>
using namespace std;
int a[45];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        queue<int>Q;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            if(Q.empty())
                Q.push(a[i]);
            else
            {
                if(Q.front()==a[i])
                    Q.pop();
                else Q.push(a[i]);
            }
        }
        if(Q.empty())
            printf("Frederica Bernkastel\n");
        else
        {
            while(!Q.empty())Q.pop();
            for(int i=n; i>0; i--)
            {
                if(Q.empty())
                    Q.push(a[i]);
                else
                {
                    if(Q.front()==a[i])
                        Q.pop();
                    else Q.push(a[i]);
                }
            }
            if(Q.empty())
                printf("Frederica Bernkastel\n");
            else
                printf("Furude Rika\n");
        }
    }
    return 0;
}
生物課程 時間限制:1秒 空間限制:131072K

題目描述

????????是一名武偵高狙擊科的學生,武偵高也設有基礎學科,現在她正
在完成生物課的作業。
給出一張??個點??條邊的無向圖,這張無向圖描述了一個細胞,細胞有
三種:X型、Y型還是I型。 技術分享 如圖,虛線方向的鏈可以無限延伸,現在需要判斷給定的圖是哪一種
細胞,或者都不是。

輸入描述:

第一行,兩個正整數??,??。
接下來??行,每行兩個正整數??, ??描述一條無向邊。

輸出描述:

輸出這種細胞的類型,若都不是輸出NotValid。
示例1

輸入

7 6
1 2
1 3
1 4
1 5
5 6
6 7

輸出

X
示例2

輸入

7 6
1 2
1 3
3 4
1 5
5 6
6 7

輸出

Y
示例3

輸入

2 1
1 2

輸出

I
示例4

輸入

8 7
1 2
1 3
1 4
4 5
5 6
5 7
5 8

輸出

NotValid

備註:

對於100%的數據,2 ≤ ?? ≤ 500,0 ≤ ?? ≤ ??*(???1)/2,沒有重邊和自環。

這個D其實可以卡一些做法?大佬說要考慮單獨的點,但是單獨的點並不影響整個結構啊,我直接討論了每種情況的每類點的個數就過了

#include <bits/stdc++.h>
using namespace std;
int a[505];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0; i<m; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x]++,a[y]++;
    }
    int f1=0,f2=0,f3=0,f4=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==1)
            f1++;
        else if(a[i]==2)
            f2++;
        else if(a[i]==3)
            f3++;
        else if(a[i]==4)
            f4++;
    }
    if(f4==1&&f1==4&&f2==n-5)
        printf("X");
    else if(f3==1&&f1==3&&f2==n-4)
        printf("Y");
    else if(f2==n-2&&f1==2)
        printf("I");
    else printf("NotValid");
    return 0;
}

這樣也過了,說明數據特別嚴謹,沒有出現有些點沒邊的情況。欸不對,既然是圖了,肯定每個點都有邊,還是下面這個做法好啊

#include <bits/stdc++.h>
using namespace std;
int a[505];
int main()
{
    int n,m,f=0;;
    scanf("%d%d",&n,&m);
    for(int i=0; i<m; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x]++,a[y]++;
    }
    for(int i=1;i<=n;i++)
    if(a[i]==1)f++;
    if(f==4)printf("X");
    else if(f==3)printf("Y");
    else if(f==2)printf("I");
    else printf("NotValid");
    return 0;
}
絕對半徑2051 時間限制:1秒 空間限制:131072K

題目描述

????????是一名狙擊手,憑借肉眼視覺可以做到精確命中絕對半徑2051公尺的一切目標。
作為一名優秀的狙擊手,????????不僅經常保養槍支,也經常保養彈藥。
????????有??枚子彈,第??枚的型號為????,????????打算扔掉其中最多??枚。
大多數優秀的狙擊手都有藝術癖好,????????希望扔掉一部分子彈後,最
長的連續相同子彈序列的長度盡量長。

輸入描述:

第一行,兩個整數??,??。
第二行,??個正整數????。

輸出描述:

一行,一個整數,最長的連續相同子彈序列的長度。
示例1

輸入

8 1
1 1 1 2 2 3 2 2

輸出

4

備註:

對於10%的數據,?? ≤ 10。
對於30%的數據,?? ≤ 1000。
對於60%的數據,???? ≤ 30。
對於100%的數據,0 ≤ ?? ≤ ?? ≤ 105,1 ≤ ???? ≤ 109。

n個數去掉其中k個數,使相同的序列最長,我本來寫的尺取回退有問題,一直在炸,還是用map維護這個尺取比較好啊

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
map<int,int> M;
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for (int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    int i=1,j=1,ans=1;
    while (i<=n)
    {
        while (j<=n&&j-i-M[a[i]]<=k)
        M[a[j++]]++;
        ans=max(ans,M[a[i]]);
        M[a[i++]]--;
        while (i<=n&&a[i]==a[i-1])
        M[a[i++]]--;
    }
    printf("%d\n",ans);
    return 0;
}

Wannafly模擬賽3