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. 1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录

    <Redis深度历险:核心原理和应用实践>1.基础: 万丈高楼平地起——Redis基础数据结构 学习记录http://naotu.baidu.com/file/b874e2624d3f37 ...

  2. UWP学习记录1-开端

    UWP学习记录1-开端 1.背景 针对不同基础的人,学习的路线自然是不同的.这篇文章记录的是我个人的学习路线,或者说笔记.我对自己的技术状态的定义是: A.有很好的windows平台编程基础: B.有 ...

  3. ACM学习-POJ-1143-Number Game

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1143-Number Game Number Game Time Limit: 1000MS   Memory ...

  4. 学习javascript数据结构(四)——树

    前言 总括: 本文讲解了数据结构中的[树]的概念,尽可能通俗易懂的解释树这种数据结构的概念,使用javascript实现了树,如有纰漏,欢迎批评指正. 原文博客地址:学习javascript数据结构( ...

  5. java后端学习记录2019

    学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...

  6. leveldb 学习记录(三) MemTable 与 Immutable Memtable

    前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...

  7. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplistleveldb 学习记录(二) Sliceleveldb 学习记录(三) MemTable 与 Immutable Memtablelevel ...

  8. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  9. JVM学习记录-线程安全与锁优化(二)

    前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...

  10. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

随机推荐

  1. opencv实战之透视变换

    import cv2 import numpy as np import pytesseract def cv_show(imgname,img): cv2.imshow(imgname,img) c ...

  2. ssh 修改端口号 --centos 7

    1 vim /etc/ssh/sshd_config Port   XXXXX #XXXXX 为要修改的端口号,默认是22,直接在新的行添加Port   XXXXX即可. 2 systemctl re ...

  3. React之一个组件的诞生

    此处以input组件为例 input.js import React from 'react' class Input extends React.Component { // ps:使用static ...

  4. C# Async / Await State Machine

    The async/await keywords in C# are very much syntactical sugar that the compiler will use to generat ...

  5. 学习 vue框架

    new watch 监听值的变化     watch: {             "input1": {                 handler(newName, old ...

  6. js过滤filter 按条件过滤

    const dataList = this.formData.tableData.filter(item => item.name !== '');

  7. hdu: Dire Wolf(区间DP)

    Problem DescriptionDire wolves, also known as Dark wolves, are extraordinarily large and powerful wo ...

  8. hbase 集群写入能力优化-预分区、TTL的应用

    一.概述 hbase 写入优化除了参数配置之外,很大的一块要考虑避免region的热点问题,避免region 热点问题,主要的目的是提高hbase 数据表rowkey的分散.结合实际情况主要有以下几个 ...

  9. vim用法思维导图

  10. 2020.11.24 javaScript匿名函数的使用

    参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...