Wannafly模拟赛3

喜欢想飞啊,毕竟这里的题目还都算挺好的中文题,不过做英文题久了还是感觉英文题更好理解一点

反蝴蝶效应
时间限制: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;
}

 

posted @ 2017-10-10 08:59  暴力都不会的蒟蒻  阅读(859)  评论(0编辑  收藏  举报