【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. Hive和Hadoop

    我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...

  2. My algorithmic road

    序言 初窥门径 1 第一题 素数的烦恼 离开了家乡,你到达了数字之地,在这里数字2总感觉自己是自然数中最独特的一个,他只有一和它本身两个因数,为此它十分苦恼.为了不再寂寞,他建立了素数王国,他请求许多 ...

  3. 一键分享QQ、微信、微博等

    github上找到的,合并了一个二维码在线支持API,直接修改样式可用. 二维码API说明网址:http://www.liantu.com/pingtai/ <html> <head ...

  4. kvm网卡配置

    https://blog.51cto.com/quliren/2046001 https://blog.51cto.com/quliren/2045555 https://blog.csdn.net/ ...

  5. angular 中如何使用自定义组件

    1.创建header组件 ng g component components/header header.component.ts import { Component, OnInit } from ...

  6. Android 摇一摇监听实现

    package com.loaderman.androiddemo; import android.content.Context; import android.hardware.Sensor; i ...

  7. MeasureSpec常用方法

    package com.loaderman.customviewdemo; import android.content.Context; import android.util.AttributeS ...

  8. Java 处理json字符串value中多余的双引号

    转: Java 处理json字符串value中多余的双引号 一.错误场景 json字符串的value值中有多余的双引号 1.直接上错误的json字符串 1 String errorJsonStr =  ...

  9. flutter编译ios的时候需要进行的操作:

    pod install  执行这个命令,安装依赖

  10. 使用Lock对象实现同步效果

    Lock是一个接口,为了使用一个Lock对象,需要用到   Lock lock = new ReentrantLock();   与 synchronized (someObject) 类似的,loc ...