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的奇迹,通过无限轮回成功打破了世界线收束理论。
和某民科学者不同,贝伦并不在意世界线收束的那套理论,作为奇迹
之魔女,贝伦的爱好只在于品茶。
作为品茶的消遣,贝伦正在解一道简单的谜题。
∙ 两个子序列中的数要完全一样,{1, 2} = {1, 2},{1, 2} ≠ {2, 1}。
为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; }
本文来自博客园,作者:暴力都不会的蒟蒻,转载请注明原文链接:https://www.cnblogs.com/BobHuang/p/7643914.html