【P3662】[USACO17FEB]Why Did the Cow Cross the Road II S

求解连续的k个数的最大值,利用前缀和维护即可。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e6+;
int sum[N];
int main()
{
int n,b,k;
scanf("%d%d%d",&n,&k,&b);
for(int i=,x;i<b;i++){
scanf("%d",&x);
sum[x] = ;
}
for(int i=;i<=n;i++) sum[i] = sum[i-] + sum[i] ;
int ans = n ;
for(int i=;i+k-<=n;i++){
ans = min( sum[i+k-] - sum[i-] , ans);
}
printf("%d\n",ans);
return ;
}

【P1540 机器翻译】

利用数组来存是否出现过,因为容量优先,所以可以开一个数组模拟队列出队和入队过程即可。

 #include<cstdio>
#include<algorithm>
using namespace std; const int N = 1e5+;
int vis[N],a[N],cnt,n,m;
int main()
{
int L = , R = , x ;
scanf("%d%d",&m,&n);
for(int i=;i<n;i++){
scanf("%d",&x);
if( vis[x] == ){ vis[ x ] = ;
cnt ++ ;
a[++R] = x ;
if( R > m ){
vis[a[++L]] = ;
}
}
}
printf("%d\n",cnt);
return ;
}

【P1090 合并果子】

利用二叉堆或者用STL中的优先队列进行插入和取出操作。完成这一个贪心的过程。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e5+;
typedef long long ll;
ll a[N];
int main()
{
priority_queue< ll , vector<ll>, greater<ll> > Q;
//priority_queue< ll > Q;
int n;
cin >> n ;
for( int i = ; i <= n ; i++ ){
cin >> a[i];
Q.push(a[i]);
}
if( n < ){
cout << a[] << endl;
}else{
ll ans = ;
ll cur;
n--;
while( n-- ){
cur = Q.top();
//cout << " Cur 1 : " << cur <<endl;
Q.pop();
cur = cur + Q.top();
//cout << " Cur 2 : " << cur <<endl;
Q.pop();
ans += cur ;
Q.push(cur);
}
cout<<ans<<endl;
}
return ;
}

【P1996 约瑟夫问题】

利用队列或者链表模拟,或者用STL进行模拟即可。

我这里就使用最传统的模式。

 #include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
const int N = 1e5+; typedef struct Node{
int val ;
Node * next;
}Node;
Node *head , *tail , *tmp, *p ; int main()
{
int n,m;
head = new Node ;
head -> next = NULL ;
tail = head ;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
p = new Node ;
p -> val = i ;
p -> next = NULL ;
tail -> next = p ;
tail = p ;
} p = head -> next ;
tail -> next = head -> next; for(int i=;i<=n;i++){ for(int j=;j<m-;j++){
p = p->next;
}
printf("%d ",p->next->val);
tmp = p -> next ;
p -> next = tmp -> next ;
p = p -> next ;
free(tmp);
}
return ;
}

【P1160 队列安排】

题目描述

一个学校里老师要将班上NN个同学排成一列,同学被编号为1∼N,他采取如下的方法:

  1. 先将1号同学安排进队列,这时队列中只有他一个人;

  2. 2-N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1∼(i−1)中某位同学(即之前已经入列的同学)的左边或右边;

  3. 从队列中去掉M(M<N)个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

输入输出样例

输入 #1

4
1 0
2 1
1 0
2
3
3
输出 #1

2 4 1

说明/提示

样例解释:

将同学2插入至同学11左边,此时队列为:

2 1

将同学3插入至同学22右边,此时队列为:

2 3 1

将同学4插入至同学11左边,此时队列为:

2 3 4 1

将同学3从队列中移出,此时队列为:

2 4 1

同学3已经不在队列中,忽略最后一条指令

最终队列:

2 4 1


【题意】名字很像用队列来做,其实使用链表来做的。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e5+;
typedef struct Node{
Node * L ;
Node * R ;
int val ;
Node () {}
}Node ; Node *Ptr[N];
int n,m,k,opt;
int vis[N];
int main()
{
Node *Start = new Node() ;
Node *First = new Node() ;
Node *End = new Node() ;
Node *tmp = new Node() ; Start->L = NULL ;
Start->R = First ;
First->L = Start;
First->R = End ;
First->val = ;
End->L = First ;
End->R = NULL ; Ptr[] = First; //printf("#### %d #### \n",Ptr[1]->val );
scanf("%d",&n); for(int i=;i<=n;i++){ scanf("%d%d",&k,&opt);
Node *p = new Node();
p->val = i ;
if( opt == ){
tmp = Ptr[k]-> R ; p->R = tmp ;
p->L = Ptr[k]; tmp->L = p;
Ptr[k]->R = p ; Ptr[i] = p ;
}else{
tmp = (Ptr[k]->L) ; p->L = tmp ;
p->R = Ptr[k]; tmp->R = p;
Ptr[k]->L = p ; Ptr[i] = p ;
}
} scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d",&k);
vis[k] = ;
}
int cnt = ;
for( tmp = Start->R; tmp->R != NULL ; tmp = tmp->R ){
if( !vis[tmp->val] ){
printf("%d",tmp->val);
if( tmp->R == End ){
printf("\n");
}else{
printf(" ");
}
} //cnt --;
}
return ;
}

【P2776小组队列

【题解】

  求解下一个是哪一组的同学弹出,如果弹空就下一组。

  需要用两个队列来存放,第一个队列是存放哪一个组排在前面,第二个队列是哪一组存放哪些同学。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e5+; template <class T>
void read( T & x ){
x = ;
int f = ;
char c =getchar();
while( !(''<=c && c<='') ){
if( c=='-' ) f = - ;
c = getchar();
}
while( (''<=c && c<='') ){
x = (x<<) + (x<<) + c-'';
c = getchar();
}
x = x * f ;
}
queue<int> Q , que[];
char opt[N] ;
int group[N];
int n,m,k,t; int main(){
read(n),read(m);
for(int i=;i<n;i++) read( group[i] ); read(k);
for(int i=;i<=k;i++){
scanf("%s",opt);
if( opt[] == 'u' ){
scanf("%d",&t);
if( que[group[t]].empty() ) Q.push(group[t]);
que[group[t]].push(t); }else{
int tmp = Q.front();
printf("%d\n",que[tmp].front());
que[tmp].pop();
if( que[tmp].empty() )
Q.pop();
}
}
return ;
}

【P1087 FBI树】

非常感谢这位网友的图。

其实我一直没有看懂题意是什么。

                     F			   长度为8

           F                    F	   长度为4

   F           B           F           I   长度为2

I     B     B     B     I     B     I     I长度为1
| | | | | | | |
| | | | | | | |
1 0 0 0 1 0 1 1

【题意】

给出一个2^n的序列,然后最底的一层就是题目所给的。请问这棵树建出来之后就需要看看。每一个节点的情况。

利用后序遍历序列。

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e6+;
int tree[N],n; void print( int K , int d ){
if( K == ){
printf("B");
}else if( K == <<d ){
printf("I");
}else{
printf("F");
}
} int dfs(int id,int dep){
int res = ;
if( dep == n ){
return tree[id];
} int L = dfs(id<< ,dep + );
print(L,(n-dep-));
int R = dfs(id<<|,dep + );
print(R,(n-dep-));
tree[id] = L + R ;
if( id == ){
print(tree[id],n);
}
return tree[id];
}
int main()
{
scanf("%d",&n); for(int i=<<n ; i<<<n+ ; i++ )
scanf("%1d",&tree[i]);
if( n == ){
printf("%c\n",tree[] ? 'I':'B');
return ;
}
dfs(,); return ;
}

【P1827 美国血统 American Heritage】

【题解】

经典问题之知道两个序列,如何求第三条。

我看了别人的代码后,一拍脑袋,发现是如此简单。

我们可以利用下标来存起末位置。

然后利用前缀和中缀的根节点的位置,确定左子树和右子树的规模。

 #include<bits/stdc++.h>
using namespace std; void dfs( string u , string v ){
if( !u.length() ) return ;
int pos = u.find( v[] ) ;
dfs( u.substr(,pos) , v.substr(,pos) ) ;
dfs( u.substr(pos+) , v.substr(pos+) ) ;
cout << v[] ;
}
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(NULL) , cout.tie(NULL) ;
string s , t ;
cin >> s >> t ;
dfs( s , t );
cout << endl;
return ;
}

【P1030 求先序排列】

【题意】

  知道中序遍历和后序遍历,求先序遍历

 #include<bits/stdc++.h>
using namespace std;
void dfs( string u , string v ){
if( !u.length() ) return ;
int pos = u.find( v[v.length()-] );
cout << v[v.length()-] ;
dfs( u.substr(,pos) , v.substr(,pos) );
dfs( u.substr(pos+) , v.substr(pos,v.length()-pos-) );
}
int main()
{
ios_base :: sync_with_stdio(false );
cin.tie(NULL) , cout.tie(NULL) ;
string u , v ;
cin >> u >> v ;
dfs( u , v );
cout << endl;
return ;
}

【数据结构】洛谷2019 OI春令营 - 普及组 作业的更多相关文章

  1. 【贪心】洛谷2019 OI春令营 - 普及组 作业

    [P3817 小A的糖果 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. [贪 ...

  2. 【动态规划】洛谷2019 OI春令营 - 普及组 作业

    [P1464 Function] [题解] 按照题目意思进行递归即可,但是过程中需要用到记忆化搜索. #include<bits/stdc++.h> using namespace std ...

  3. 【洛谷2019 OI春令营】期中考试

    T68402 扫雷 题目链接:传送门 题目描述 扫雷,是一款单人的计算机游戏.游戏目标是找出所有没有地雷的方格,完成游戏:要是按了有地雷的方格,游戏失败.现在 Bob 正在玩扫雷游戏,你作为裁判要判断 ...

  4. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  5. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  6. 洛谷2019 3月月赛 T2

    题干 洛谷同款 T2?(看似比T1简单些) 二维前缀和嘛?[多简单 我天天拿二维前缀和水DP] 这是前缀和的预处理 2333 处理出来所有的情况 某个地方要加上mod再%mod 如果没有这一步 那么 ...

  7. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  8. 洛谷2019 3月月赛 T1

    题干 2019第一次月赛 我只有255pts T1还是比较水的... 海星 T1一道简单的模拟(就是有坑..导致很多人不能一次性AC 比如说我) _3个坑点 1.位数问题 2.-0 3.0... #i ...

  9. 洛谷2019 3月月赛 T4

    T3做不来.. 直接滚去T4 orz 乍一看 T4是个DP 题干 复杂度??(N^4) 咋优化... 还带一只捆绑 捆绑啥的最烦人了 最后20pts 直接废了 T了 很烦 不过拿到80pts已经很开心 ...

随机推荐

  1. Navicat Premium 12安装与激活(亲测已成功激活)

    说明:博主所提供的激活文件理论支持Navicat Premium 12.0.16 - 12.0.24简体中文64位,但已测试的版本为Navicat Premium 12.0.22.12.0.23和12 ...

  2. apache配置https重定向

    apache配置https重定向 一.总结 一句话总结: 网上找不到答案的原因是因为没有精准的描述问题,没有把问题描述清楚:尽量把关键词描述清楚 1.apache将80端口重定向443的具体步骤(在 ...

  3. VM 15 永久激活密钥

      VMware Workstation 15 永久激活密钥   YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8   UG5J2-0ME12-M89WY-NPWXX-WQH88   UA5 ...

  4. OpenJudge计算概论-分数求和

    /*====================================================== 1006:分数求和 总时间限制: 1000ms 内存限制: 65536kB 描述 输入 ...

  5. 连接池设置导致的“血案” 原创: 一页破书 一页破书 5月6日 这个问题被投诉的几个月了,一直没重视——内部客户嘛😿 问题现象: 隔几周就会出现 A服务调用B服务超时 脚趾头想就是防火墙的问题,A、B两服务之间有防火墙 找运维查看防火墙日志确实断掉了tcp连接,但是是因为B服务5分钟没有回包,下面这个表情就是我当时的心情——其实我们在防火墙、A服务、B服务都抓包了,几十个G的t

    连接池设置导致的“血案” 原创: 一页破书 一页破书 5月6日 这个问题被投诉的几个月了,一直没重视——内部客户嘛

  6. hystrix流程图收藏

    最近在看张开涛的亿级流量的书,学习了一个新的防雪崩的功能hystrix,在学习这个功能的过程中,看了一些网站也温习了一些知识,例如double_check locking功能,还有cache的击穿作为 ...

  7. 查看linux是几位操作系统

    查看linux是几位操作系统 摘自:https://blog.csdn.net/a34569345/article/details/80179927 2018年05月03日 14:44:44 bill ...

  8. js实现div吸顶效果

    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> < ...

  9. 【Leetcode_easy】682. Baseball Game

    problem 682. Baseball Game solution: 没想到使用vector! class Solution { public: int calPoints(vector<s ...

  10. 【Leetcode_easy】637. Average of Levels in Binary Tree

    problem 637. Average of Levels in Binary Tree 参考 1. Leetcode_easy_637. Average of Levels in Binary T ...