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();

算法

(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;}

0 0
原创粉丝点击