ACM的资料(1)
来源:互联网 发布:泰拉瑞亚数据如何恢复 编辑:程序博客网 时间:2024/04/29 02:28
(1)map的使用(Uva508)
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<math.h>
#include<string>
#include<set>
#include<queue>
#include<map>
using namespace std;
int maxn=9999999;
map<char, string> morse;
map<string,string> dict;
int main()
{
freopen("G://test.txt","r",stdin);
string a, b;
while(cin>>a&&a!="*")
{
cin>>b;
morse[a[0]] = b;
}
while(cin>>a&&a!="*"){
string res;
for(int i = 0; i <a.size(); i++)
res += morse[a[i]];
dict[a] = res;
}
while(cin>>a&&a!="*"){
intd=maxn;
stringans=dict.begin()->first;
for(auto i = dict.begin(); i != dict.end(); i++){
int tt;
string code=a;
stringmoban=i->second;
if(code==moban)
tt=0;
if(code.size() > moban.size())
swap(code,moban);
if(code== moban.substr(0,code.size()))
tt=moban.size() - code.size();
else
tt=maxn;
if(tt<d){
d=tt;
ans=i->first;
}
else if(d==0&&tt==0&&ans[ans.size()-1]!='!')
ans+="!";
}
if(d!=0)
ans+="?";
cout<<ans<<endl;
}
return0;
}
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
3 算法
(1) 使用reverse将元素翻转:需要头文件#include<algorithm>
reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,
一般后一个都不包含.)
(2)使用sort排序:需要头文件#include<algorithm>,
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
Set:
4,set的基本操作:
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素的迭代器
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
map
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
double sin(double);正弦 double cos (double);余弦 double tan (double);正切 2 、反三角函数 double asin (double); 结果介于[-PI/2,PI/2] double acos (double); 结果介于[0,PI] double atan (double); 反正切(主值), 结果介于[-PI/2,PI/2] double atan2 (double, double); 反正切(整圆值), 结果介于[-PI,PI] 3 、双曲三角函数 double sinh (double); double cosh (double); double tanh (double); 4 、指数与对数 double exp (double);求取自然数e的幂 double sqrt (double);开平方 double log (double); 以e为底的对数 double log10 (double);以10为底的对数 double pow(double x, double y);计算以x为底数的y次幂 float powf(float x, float y); 功能与pow一致,只是输入与输出皆为浮点数 5 、取整 double ceil (double); 取上整 double floor (double); 取下整 6 、绝对值 double fabs (double);求绝对值 double cabs(struct complex znum) 求复数的绝对值 7 、标准化浮点数 double frexp (double f, int *p); 标准化浮点数, f = x* 2^p, 已知f求x, p ( x介于[0.5, 1] ) double ldexp(double x, int p); 与frexp相反, 已知x, p求f 8 、取整与取余 double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分 double fmod (double,double); 返回两参数相除的余数 9 、其他 double hypot(double x, double y);已知直角三角形两个直角边长度,求斜边长度 double ldexp(double x,int exponent);计算x*(2的exponent次幂) double poly(double x, intdegree, double coeffs [] );计算多项式 nt matherr(structexception *e);数学错误计算处理程序
for(inti=0;i<n;++i){
int a,b;
scanf("%d%d",&a,&b);
p[a]=b;
}
for(int i=0;i<=n;++i){
len[i]=0;
}
intc=1;
len[c]=p[1];
for(int i=2;i<=n;++i){
if(len[c]<p[i])
{
len[++c]=p[i];
}
else
{
int s,e,m;
s=1;e=c;
while(s<e)
{
m=(s+e)>>1;
if(len[m]<p[i]) s=m+1;
else e=m;
}
m=e;
len[m]=p[i];
}
}
o poj3468 A Simple Problem with Integers
题意:O(-1)
思路:O(-1)
线段树功能:update:成段增减 query:区间求和
?View Code CPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define LL long long
const int maxn= 111111;
LL add[maxn<<2];
LL sum[maxn<<2];
void PushUp(int rt){
sum[rt]= sum[rt<<1]+ sum[rt<<1|1];
}
void PushDown(int rt,int m){
if (add[rt]){
add[rt<<1]+= add[rt];
add[rt<<1|1]+= add[rt];
sum[rt<<1]+= add[rt]* (m - (m >> 1));
sum[rt<<1|1]+= add[rt]* (m >> 1);
add[rt]= 0;
}
}
void build(int l,int r,int rt){
add[rt]= 0;
if (l == r) {
scanf("%lld",&sum[rt]);
return ;
}
int m = (l + r)>> 1;
build(lson);
build(rson);
PushUp(rt);
}
void update(int L,int R,int c,int l,int r,int rt) {
if (L <= l && r<= R) {
add[rt]+= c;
sum[rt]+= (LL)c *(r - l + 1);
return ;
}
PushDown(rt , r - l + 1);
int m = (l + r)>> 1;
if (L <= m) update(L , R , c , lson);
if (m < R) update(L , R , c , rson);
PushUp(rt);
}
LL query(int L,int R,int l,int r,int rt){
if (L <= l && r<= R) {
return sum[rt];
}
PushDown(rt , r - l + 1);
int m = (l + r)>> 1;
LL ret = 0;
if (L <= m) ret+= query(L , R , lson);
if (m < R) ret+= query(L , R , rson);
return ret;
}
int main(){
int N , Q;
scanf("%d%d",&N,&Q);
build(1 , N ,1);
while (Q --){
char op[2];
int a , b , c;
scanf("%s",op);
if (op[0]== 'Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",query(a , b , 1 , N , 1));
} else {
scanf("%d%d%d",&a,&b,&c);
update(a , b , c ,1 , N , 1);
}
}
return 0;
}
/*Dijkstra求单源最短路径 2010.8.26*/
typedef struct node{
int matrix[N][M]; //邻接矩阵 int n; //顶点数 inte; //边数}MGraph;
void DijkstraPath(MGraph g,int *dist,int*path,int v0) { //v0表示源顶点
int i,j,k;
bool *visited=(bool *)malloc(sizeof(bool)*g.n);
for(i=0;i<g.n;i++) //初始化
{
if(g.matrix[v0][i]>0&&i!=v0)
{
dist[i]=g.matrix[v0][i];
path[i]=v0; //path记录最短路径上从v0到i的前一个顶点
}
else{
dist[i]=INT_MAX; //若i不与v0直接相邻,则权值置为无穷大
path[i]=-1;
}
visited[i]=false;
path[v0]=v0;
dist[v0]=0;
}
visited[v0]=true;
for(i=1;i<g.n;i++) { //循环扩展n-1次
int min=INT_MAX;
int u;
for(j=0;j<g.n;j++) //寻找未被扩展的权值最小的顶点
if(visited[j]==false&&dist[j]<min){
min=dist[j];
u=j;
}
visited[u]=true;
for(k=0;k<g.n;k++) //更新dist数组的值和路径的值
{
if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]<dist[k]){
dist[k]=min+g.matrix[u][k];
path[k]=u;
}
}
}
}
void showPath(int *path,int v,int v0) { //打印最短路径上的各个顶点
stack<int> s;
int u=v;
while(v!=v0){
s.push(v);
v=path[v];
}
s.push(v);
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
}
int main(int argc, char*argv[]){
int n,e; //表示输入的顶点数和边数
while(cin>>n>>e&&e!=0) {
int i,j;
int s,t,w; //表示存在一条边s->t,权值为w
MGraph g;
int v0;
int *dist=(int *)malloc(sizeof(int)*n); int *path=(int *)malloc(sizeof(int)*n);
for(i=0;i<N;i++)
for(j=0;j<M;j++)
g.matrix[i][j]=0;
g.n=n; g.e=e;
for(i=0;i<e;i++) {
cin>>s>>t>>w;
g.matrix[s][t]=w;
}
cin>>v0; //输入源顶点
DijkstraPath(g,dist,path,v0);
for(i=0;i<n;i++) {
if(i!=v0){
showPath(path,i,v0); cout<<dist[i]<<endl;}}} return 0;}
- ACM的资料(1)
- 关于ACM的一些资料
- ACM资料
- ACM资料
- ACM 资料
- 最全的acm资料web
- 最全的acm资料web
- 最全的acm资料web
- 关于acm专题的相关资料下载
- 备战ACM/ICPC资料
- 备战ACM/ICPC资料
- 备战ACM资料
- ACM算法相关资料
- 备战ACM/ICPC资料
- ACM算法相关资料
- 备战ACM资料
- ACM算法相关资料
- ACM算法相关资料
- jsp中页面之间的跳转forward与sendRedirect的区别
- ppt文档快速的转换为pdf方法分享
- 【Linux】IO多路转接
- 工作中用到的模型诊断指数
- C++之指针指向二维数组
- ACM的资料(1)
- 大数据=广告吗?
- 黑马程序员————Java基础日常笔记---对集合的理解与总结二
- Ubuntu 14.04环境变量修改
- eclipse转android studio必看。
- C,C++,VC++有什么区别
- Android有关surfaceView重新创建的问题。
- jQuery插件开发详细教程
- 自已实现一个UI库