ACM-学习记录-数据结构-1
AOJ-ALDS1_1_D Maximum Profit
本题主要考虑要将复杂度降到O(n),否则过不了最后五组数据
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,maxv=-1e10;
int stock[200000 + 5];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>stock[i];
}
int minv=stock[0];
for(int j=1;j<n;j++)
{
maxv=max(maxv, stock[j]-minv);
minv=min(minv, stock[j]);
}
cout<<maxv<<endl;
return 0;
}
STL标准库
栈stack
| 函数名 | 功能 | 复杂度 |
|---|---|---|
| size() | 返回栈的元素数 | O(1) |
| top() | 返回栈顶元素 | O(1) |
| pop() | 从栈中取出并删除元素 | O(1) |
| push() | 添加元素x | O(1) |
| empty() | 在栈为空时返回true | O(1) |
ALDS1_3_A Stack
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
int main()
{
stack<int> s;
int a,b,x;
string str;
while(cin>>str)
{
if(str[0]=='+')
{
a=s.top(); s.pop();
b=s.top(); s.pop();
s.push(a+b);
}
else if(str[0]=='-')
{
b=s.top(); s.pop();
a=s.top(); s.pop();
s.push(a-b);
}
else if(str[0]=='*')
{
a=s.top(); s.pop();
b=s.top(); s.pop();
s.push(a*b);
}
else
{
s.push(atoi(str.c_str()));
}
}
cout<<s.top()<<endl;
return 0;
}
队列queue
| 函数名 | 功能 | 复杂度 |
|---|---|---|
| size() | 返回队列元素数 | O(1) |
| front() | 返回队头元素 | |
| pop() | 从队列中取出并删除元素 | |
| push() | 向队列中添加元素 | |
| empty() | 在队列为空时返回true |
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
int n,q,t;
string name;
queue<pair<string, int> > Q;
cin>>n>>q;
for(int i=0;i<n;i++)
{
cin>>name>>t;
Q.push(make_pair(name, t));
}
pair<string ,int> u;
int elap=0,a;
while(!Q.empty())
{
u=Q.front(); Q.pop();
a=min(u.second, q);
u.second-=a;
elap+=a;
if(u.second>0)
{
Q.push(u);
}
else
{
cout<<u.first<<" "<<elap<<endl;
}
}
return 0;
}
vector
| 函数名 | 功能 |
|---|---|
| size() | 返回向量的元素数 |
| push_back() | 在向量末尾添加元素x |
| pop_back() | 删除向量的最后一个元素 |
| begin() | 返回指向向量开头的迭代器 |
| end() | 返回指向向量末尾的迭代器 |
| insert(p,x) | 在向量的位置p处插入元素x |
| erase(p) | 删除向量中位置p的元素 |
| clear() | 删除向量中的所有元素 |
双向链表List
| 函数名 | 功能 |
|---|---|
| size() | 返回表的元素数 |
| begin() | 返回指向表开头的迭代器 |
| end() | 返回指向表末尾的迭代器 |
| push_front(x) | 在表开头添加元素x |
| push_back(x) | 在表末尾添加元素x |
| pop_front() | 删除位于表开头的元素 |
| pop_back() | 删除位于表末尾的元素 |
| insert(p, x) | 在表的位置p处插入元素x |
| erase(p) | 删除表中位置p的元素 |
| clear() | 删除表中所有元素 |
ALDS1_3_C: Doubly Linked List
#include<iostream>
#include<cstdlib>
#include<list>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
int q,x;
string command;
list<int> v;
cin>>q;
for(int i=0;i<q;i++)
{
cin>>command;
if(command[0]=='i')
{
cin>>x;
v.push_front(x);
}
else if(command[6]=='L')
{
v.pop_back();
}
else if(command[6]=='F')
{
v.pop_front();
}
else if(command[0]=='d')
{
cin>>x;
for(list<int>::iterator it=v.begin();it!=v.end();it++)
{
if(*it == x)
{
v.erase(it);
break;
}
}
}
}
int i=0;
for(list<int>::iterator it=v.begin(); it!=v.end();it++)
{
if(i++) cout<<" ";
cout<<*it;
}
cout<<endl;
return 0;
}
ALDS1_3_D: Areas on the Cross-Section Diagram
- 如果是“\”,则将表示该字符位置的整数i压入栈S1
- 如果是“/”,则送S1顶部取出与之对应的""的位置i,算出二者的距离并累加到总面积内
- “_”的作用只是将一对/距离增加1,然而在代码中已经通过数学方法计算了,因此可以忽略掉"__"符号
- 新形成的面积=当前S2中的两个面积之和+新形成的i-j部分的面积,从S1中取出被引用的多个面积,再将新算出的面积压入S2。
#include<iostream>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
stack<int> S1;
stack<pair<int ,int> > S2;
char c;
int sum=0;
for(int i=0;cin>>c;i++)
{
if(c=='\\') S1.push(i);
else if(c=='/' && S1.size()>0)
{
int j=S1.top(); S1.pop();
sum+=i-j;
int a=i-j;
while(S2.size()>0 && S2.top().first>j)
{
a+=S2.top().second; S2.pop();
}
S2.push(make_pair(j, a));
}
}
vector<int> ans;
while(S2.size()>0)
{
ans.push_back(S2.top().second);
S2.pop();
}
reverse(ans.begin(),ans.end());
cout<<sum<<endl;
cout<<ans.size();
for(int i=0;i<ans.size();i++)
{
cout<<" "<<ans[i];
}
cout<<endl;
}
迭代器
基本运算符
| 符号 | 作用 |
|---|---|
| ++ | 让迭代器指向至下一元素 |
| ==,!= | 判断两个迭代器是否指向同一位置并返回结果 |
| = | 将右侧的值代入左侧迭代器所引用的元素的位置 |
| * | 返回该位置的元素 |
lower_bound
返回一个指向第一个不小于指定值value的元素
排序sort
stable_sort较稳定
*sort的应用*;
1、可以传入两个参数;
sort(a,a+N) ,其中a是数组,a+N表示对a[0]至a[N-1]的N个数进行排序(默认从小到大排序);
2、传入三个参数;
sort(a,a+N,cmp),第三个参数是一个函数 ;
如果让函数从大到小排序,可以用如下算法实现;
bool cmp(int a,int b){return a>b};
sort(A,A+N,cmp);
而*stable_sort的用法*与sort一致,区别是stable_sort函数遇到两个数相等时,不对其交换顺序;这个应用在数组里面不受影响,当函数参数传入的是结构体时,会发现两者之间的明显区别;
ALDS1_6_D: Minimum Cost Sort
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=1000;
const int vmax=10000;
int n,a[maxn],s;
int b[maxn],t[vmax+1];
int solve()
{
int ans=0;
bool v[maxn];
for(int i=0;i<n;i++)
{
b[i]=a[i];
v[i]=false;
}
sort(b,b+n);
for(int i=0;i<n;i++)
{
t[b[i]] = i;
}
for(int i=0;i<n;i++)
{
if(v[i]) continue;
int cur=i,m=vmax,an=0,S=0;
while(1)
{
v[cur]=true;
an++;
int V=a[cur];
m=min(m,V);
S+=V;
cur=t[V];
if(v[cur]) break;
}
ans+=min(S+(an - 2) *m, m+S+(an+1)*s);//2SOLUTIONS
}
return ans;
}
int main()
{
cin>>n;
s=vmax;
for(int i=0;i<n;i++)
{
cin>>a[i];
s=min(s,a[i]);
}
int ans=solve();
cout<<ans<<endl;
return 0;
}
动态规划DP
LCS
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
const int N=1000;
int c[N+5][N+5];
using namespace std;
int lcs(string X, string Y)
{
int m=X.length();
int n=Y.length();//也可.size()
int maxl=0;
X=' '+X;
Y=' '+Y;
for(int i=1;i<=m;i++) c[i][0]=0;
for(int j=1;j<=n;j++) c[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(X[i]==Y[j])
{
c[i][j]=c[i-1][j-1]+1;
}
else
{
c[i][j]=max(c[i-1][j], c[i][j-1]);
}
maxl=max(maxl, c[i][j]);
}
}
return maxl;
}
int main()
{
string s1,s2;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s1>>s2;
cout<<lcs(s1,s2)<<endl;
}
return 0;
}
ACM-学习记录-数据结构-1的更多相关文章
- 1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录
<Redis深度历险:核心原理和应用实践>1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录http://naotu.baidu.com/file/b874e2624d3f37 ...
- UWP学习记录1-开端
UWP学习记录1-开端 1.背景 针对不同基础的人,学习的路线自然是不同的.这篇文章记录的是我个人的学习路线,或者说笔记.我对自己的技术状态的定义是: A.有很好的windows平台编程基础: B.有 ...
- ACM学习-POJ-1143-Number Game
菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1143-Number Game Number Game Time Limit: 1000MS Memory ...
- 学习javascript数据结构(四)——树
前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- leveldb 学习记录(四)Log文件
前文记录 leveldb 学习记录(一) skiplistleveldb 学习记录(二) Sliceleveldb 学习记录(三) MemTable 与 Immutable Memtablelevel ...
- Java设计模式学习记录-迭代器模式
前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...
- JVM学习记录-线程安全与锁优化(二)
前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...
- Python学习记录day7
目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...
随机推荐
- xmake构建C/C++编译环境
1. xmake介绍 XMake是一个基于Lua的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目 xmake的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得 ...
- vue 项目打包 遇到问题 npm run build 无法打包
npm run build 打包 直接报错!!! 发现package.json中build的打包后边多了一个:prod 因此打包直接使用 npm run build:prod
- html-list
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- EF OwnsOne 主键不自增
menu public class Menu { /// <summary> /// id /// </summary> [Key, DatabaseGeneratedAttr ...
- nodejs实现页面的增删查
一.在mong0db.js中写如下代码 1.导入 const mongoose = require("mongoose"); // 建立数据库连接 mongoose.connect ...
- 2003031120—廖威—Python数据分析第七周作业—MySQL的安装以及使用
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/pexy/20sj 这个作业要求链接 https://edu.cnblogs.com/campus/ ...
- Java中集合基础相关知识
1.集合基础 1.1 集合概述 编程的时候如果需要存储多个数据使用长度固定的数据存储,适应不了元素个数变化的需求,这时候我们就需要用集合. 集合类的特点:提供了一种存储空间可变的存储模型,存储的数据容 ...
- js数组常用的方法
var arr=['hello','前端','world']; 1. arr.join(分隔符):将数组中的值拼接成一个字符串,返回这个字符串,默认分隔符"," arr.join( ...
- Android 自定义View (三)
一.前言 上节 讲解了旋转圆环基本的实现方法.本文将在此基础上进一步改进,在属性文件中自定义控件属性,避免代码中显式调用setXXX() 方法. 二.流程 首先,在资源文件 values 中新建一个 ...
- idea警告 breakpoints dramatically slow down
idea启动项目提示的黄色警告 , 其实就是有地方断点之后 , 影响项目运行速 打开断点管理 , 查看具体是哪个影响了 , 断点不需要了及时取消