普及C组第三题(8.10)

2301. 【普及组T3或T4】线索 
(File IO): input:assassin.in output:assassin.out

时间限制: 1000 ms  空间限制: 262144 KB

题目描述(为毛是图片)

输入(为毛是图片)

输出(为毛是图片)

样例输入/输出(为毛是图片)

数据范围限制(为毛是图片)

思路:

(1)伪思路当然要小一点:暴力模拟左右两边判断,能像多少种情况就打多少种。。。hhh。

小代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,p=0,q=0,ans=0,sum=0;
bool flag1[1000001],flag2[1000001];
struct assassin
{
int left1,right1,money;
char a;
};
assassin ezio[1000001];
bool cmp1(assassin x,assassin y)
{
return x.left1<y.left1;
}
bool cmp2(assassin x,assassin y)
{
return x.right1<y.right1;
}
int main()
{
memset(flag1,true,sizeof(flag1));
memset(flag2,true,sizeof(flag2));
cin>>n;
for(int i=1;i<=n;i++)
cin>>ezio[i].a;
for(int i=1;i<=n;i++)
{
cin>>ezio[i].money;
sum=sum+ezio[i].money;
}
for(int i=1;i<=n;i++)
{
if(ezio[i].a==‘(‘&&i!=n)
{
for(int j=i+1;j<=n;j++)
{
if(ezio[j].a==‘)‘&&flag2[j]==true)
{
p++;
ezio[p].right1=ezio[j].money;
flag2[j]=false;
}

}
}
else if(ezio[i].a==‘(‘&&i==n)
ans+=ezio[i].money;
if(ezio[i].a==‘)‘&&i!=1)
{
for(int j=i-1;j>=1;j--)
{
if(ezio[j].a==‘(‘&&flag1[j]==true)
{
q++;
ezio[q].left1=ezio[j].money;
flag1[j]=false;
}
}
}
else if(i==1&&ezio[i].a==‘)‘)
ans+=ezio[i].money;
}
cout<<q<<" "<<p<<endl;
sort(ezio+1,ezio+p+1,cmp1);
sort(ezio+1,ezio+q+1,cmp2);
for(int k=1;k<=p;k++)
cout<<ezio[k].left1<<" ";
for(int k=1;k<=q;k++)
cout<<ezio[k].right1<<" ";
for(int i=1;i<=n;i++)
{
if(p==0&&q==0)
break;
if(q>p)
{
ans=ezio[i].left1+ans;
q--;
}
else
if(p>q)
{
ans=ezio[i].right1+ans;
p--;
}
else
break;
}
if(p==0&&q==0)
cout<<sum;
else
cout<<ans;
}

真思路自然要大一点:(不会堆的这边请,一个大佬的:神奇传送门

用一个大根堆维护左括号,小根堆维护右括号,遇上右括号就将大根堆堆顶弹出,如果大根堆空了,就加小根堆。如果小根堆空了就加大根堆,保证最后的一定小。

亲爱的代码同学又回来了:

#include<iostream>
#include<queue>
using namespace std;
int n,ans=0;
char a[100001];
int b[100001];
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int> >p;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    for(int i=1;i<=n;i++)
    cin>>b[i];
    for(int i=1;i<=n;i++)
    {
        if(a[i]==‘(‘)
        q.push(b[i]);
        else
        {
            p.push(b[i]);
            if(q.empty())
            {
                ans+=p.top();
                p.pop();
            }
            else
            q.pop();
        }
    }
    while(q.empty()==false)
    {
        ans+=q.top();
        q.pop();
    }
    cout<<ans;
}

完结撒花!!!

原文地址:https://www.cnblogs.com/YYCether666/p/11332139.html

时间: 2024-08-06 17:53:48

普及C组第三题(8.10)的相关文章

NOIP 2008提高组第三题题解by rLq

啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊

NOIP2008提高组(前三题) -SilverN

此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件matches.out共一行,

【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解

卡特兰数,这是一向掌握不大熟练的内容,今天借NOIP2003普及组的第三题来总结一下.当然由于原题数据弱抱,不需要高精.如果有时间我会不断补充这篇文章里的内容. 二话不说上代码 //Catalan #include<iostream> using namespace std; long long n,f[20]={0}; /*NO.1 f[n+1]=f[i]*f[n-i]from 0 to n plus f[0]=1 int main(){ cin>>n; f[0]=1;f[1]=

【递归】Vijos P1132 求二叉树的先序序列(NOIP2001普及组第三题)

题目链接: https://vijos.org/p/1132 题目大意: 给定二叉树的中序和后序遍历,求该二叉树先序遍历. 题目思路: [递归] 这题妥妥递归. 二叉树先序根左右,中序左根右,后序左右根. 对于每一颗子树,它的后序最后一个必定是根,于是可以根据根在中序的位置把左子树和右子树区分开来. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include<string>

Noip2012 普及组 第三题 摆花

博主声明: 新手第一次写动规的题解,如果出现错误请各位大力的喷,但不要骂脏话,最好告诉我怎么改,谢谢~.~ !!! 摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆. 通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号. 为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆, 摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列. 试编程计算,一共有多少种不同的摆花方案

【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前串长度为1停止. 给定01串,求FBI树后序. 题目思路: [递归] 每次操作先操作左子树,再操作右子树,之后统计左右子树01状态,按照要求得到当前节点是 F B I中的哪一个. 由于输出后序,所以可以每次操作完左右子树后直接输出该节点,当前串长度为1则输出完返回. 1 // 2 //by cool

全排列(洛谷1061 Jam的计数法or NOIP 2006 普及组 第三题)

Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩. 在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母.我们把这样的“数字”称为Jam数字.在Jam数字中,每个字母互不相同,而且从左到右是严格递增的.每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母.如果再规定位数为5,那么,紧接在Jam数字“bd

【动态规划】Vijos P1493 传纸条(NOIP2008提高组第三题)

题目链接: https://vijos.org/p/1493 题目大意: 二取方格数,从(1,1)向下或向右走到(n,m)走两次,每个走到的格子值只能被取一次所能取到的最大值. (n,m<=50) 题目思路: [动态规划] f[i][j][k][l]表示第一次走到(i,j)第二次走到(k,l)的最大值. 分别向上或向左转移. 1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #incl

dfs(洛谷1019 单词接龙NOIp2000提高组第三题)

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的