c++ STL平常练习-1

因为51cto不允许博文超过8万字符。我将把这些练习放到接下来的博客中,但是它们其实是连着的。

  
  
  
  
  1. #pragma warning(disable:4786) 
  2. #include <iostream> 
  3. #include <sstream> 
  4. #include <set> 
  5. #include <algorithm> 
  6. #include <map> 
  7. #include <cmath> 
  8. #include <vector> 
  9. #include <queue> 
  10. #include <deque> 
  11. #include <IOMANIP> 
  12. #include <stack> 
  13. #include <list> 
  14. using namespace std; 
  15.  
  16. #define is_year(year) ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) ? 1 : 0 
  17.  
  18. int month_day[13][2] = { 
  19.     {0,0}, 
  20.     {31,31}, 
  21.     {28,29}, 
  22.     {31,31}, 
  23.     {30,30}, 
  24.     {31,31}, 
  25.     {30,30}, 
  26.     {31,31}, 
  27.     {31,31}, 
  28.     {30,30}, 
  29.     {31,31}, 
  30.     {30,30}, 
  31.     {31,31} 
  32. }; 
  33.  
  34. class date 
  35. public
  36.     int year; 
  37.     int month; 
  38.     int day; 
  39.     date(){}; 
  40.     date(int year,int month,int day); 
  41.     void display(); 
  42.     void nextday(); 
  43. }; 
  44.  
  45. date::date(int year,int month,int day) 
  46.     this->year = year; 
  47.     this->month = month; 
  48.     this->day = day; 
  49.  
  50. void date::display() 
  51.     cout<<this->year<<'-'<<this->month<<'-'<<this->day<<endl; 
  52.  
  53. void date::nextday() 
  54.     ++day; 
  55.     if(month_day[month][is_year(year)] < day) 
  56.     { 
  57.         day = 1; 
  58.         ++month; 
  59.         if(month > 12) 
  60.         { 
  61.             month = 1; 
  62.             year++; 
  63.         } 
  64.     } 
  65. int days[5001][13][32]; 
  66. void main41() 
  67.     date temp(0,1,1); 
  68.     int day_count = 0; 
  69.     while(temp.year < 5001) 
  70.     { 
  71.         days[temp.year][temp.month][temp.day] = day_count++;         
  72.         temp.nextday(); 
  73.  
  74. //      cout<<temp.year<<' '<<temp.month<<' '<<temp.day<<' '<<day_count<<endl; 
  75.     } 
  76.     int y,m,d; 
  77.     while(cin>>y>>m>>d) 
  78.     { 
  79.         cout<<days[y][m][d]<<endl; 
  80.     } 
  81.  
  82. int qixi[50001]; 
  83. void main44() 
  84.     int i,j,num; 
  85.  
  86.     for(i=0; i<=50000; ++i) 
  87.         qixi[i] = 1; 
  88.  
  89.     for(i=2; i<=50000; ++i) 
  90.         for(j=2; i*j <= 50000; ++j) 
  91.             qixi[i*j] += i; 
  92.     while(cin>>num) 
  93.     { 
  94.         cout<<qixi[num]<<endl; 
  95.     } 
  96. //因子筛选 
  97. /*for(int i=0; i<=500000; ++i) 
  98.         qixi[i] = 1; 
  99.     for(int i=2; i<=500000; ++i) 
  100.         for(int j=2; j*i<=500000; ++j) 
  101.                 qixi[i*j] += i; 
  102.         */ 
  103.  
  104.  
  105. //素数筛选 
  106.   
  107. bool bPrime[1001];          //必须得单独赋值 
  108. void main45() 
  109.     int i,j; 
  110.     bPrime[0] = bPrime[1] = false
  111.     for(i=2; i<=1000; ++i) bPrime[i] = true
  112.     for(i=2; i<=1000; ++i) 
  113.     {  
  114.         if(bPrime[i]) 
  115.         { 
  116.             for(j=i*i; j<=1000; j+=i) 
  117.             {    
  118.             //  cout<<j<<endl; 
  119.                 bPrime[j] = false;               
  120.             } 
  121.         } 
  122.     } 
  123.     int num; 
  124.     while(cin>>num) 
  125.     { 
  126.         if(bPrime[num]) cout<<"yes"<<endl; 
  127.         else cout<<"no"<<endl; 
  128.     } 
  129.  
  130. void main46() 
  131.     char ch[10]; 
  132.     cin.get(ch,10); 
  133.     cout<<ch; 
  134.     getchar(); 
  135.  
  136.     cin.get(ch,10); 
  137.     cout<<ch; 
  138.      
  139. void main47() 
  140.     string s("-122"); 
  141.     istringstream iss(s);   //使用istringstream可以对输入进行格式化输入,不管是整数还是负数 
  142.     int a; 
  143.     iss>>a; 
  144.     cout<<a; 
  145.  
  146.     vector<int> v; 
  147.     v.push_back(3); 
  148.     v.push_back(4); 
  149.      
  150.  
  151.  
  152. #include <algorithm>//必须要有这个头文件。。。。。 
  153. int main48(int argc, char*argv[]) 
  154.  std::string str = "song"
  155.  reverse(str.begin(), str.end());  
  156.   
  157.  return 0;  
  158. }  
  159.  
  160. void main49() 
  161.     char aa[100]; 
  162.     int a; 
  163. /* 
  164.     while(cin>>a) 
  165.     {        
  166.         itoa(a,aa,10);       
  167.         cout<<aa<<endl; 
  168.         memset(aa,'0',sizeof(aa)); 
  169.     } 
  170.     */ 
  171.     while(cin>>hex>>a) 
  172.     { 
  173.         sprintf(aa,"%b",a); 
  174.         cout<<aa<<endl; 
  175.     } 
  176.  
  177. void main50() 
  178.     int a,sum = 0,max = -100; 
  179.  
  180.  
  181.     while(cin>>a && a != -1000) 
  182.     { 
  183.         sum += a; 
  184.         if(sum > max) 
  185.             max = sum; 
  186.         if(sum < 0) 
  187.             sum = 0; 
  188.     } 
  189.     cout<<max<<endl; 
  190.  
  191. int gcd(int a,int b) 
  192.     if(b == 0) 
  193.         return a; 
  194.     else return gcd(b,a%b); 
  195.  
  196. void  main51() 
  197.     int a,b; 
  198.     while(cin>>a>>b) 
  199.     { 
  200.         cout<<gcd(a,b)<<endl; 
  201.     } 
  202. //求N!阶乘中乘5的次数 
  203. void main52() 
  204.     int cnt = 0,n; 
  205.     cin>>n; 
  206.     for(int i=1; i<=n; ++i) 
  207.     { 
  208.         int j = i; 
  209.         while(j % 5 == 0) 
  210.         { 
  211.             ++cnt; 
  212.             j /= 5; 
  213.         } 
  214.     } 
  215.     cout<<cnt<<endl; 
  216.  
  217. void main53() 
  218.     int cnt=0; 
  219.     int n; 
  220.     cin>>n; 
  221.     while(n) 
  222.     { 
  223.         cnt += n/5; 
  224.         n /= 5; 
  225.     } 
  226.     cout<<cnt<<endl; 
  227.  
  228.  
  229. //并查集的操作 
  230. #define N 1000 
  231. int tree[N]; 
  232. int findRoot(int x) 
  233.     int ret = x; 
  234.     if(tree[x] != -1) 
  235.     { 
  236.         ret = findRoot(tree[x]); 
  237.         tree[x] = ret; 
  238.     } 
  239.     return ret; 
  240.  
  241.  
  242. void main54() 
  243.     int n,m; 
  244.     while(cin>>n && n != 0) 
  245.     { 
  246.         cin>>m; 
  247.         for(int i=0; i<N; ++i)  tree[i] = -1; 
  248.          
  249.         while(m--) 
  250.         { 
  251.             int a,b; 
  252.             cin>>a>>b; 
  253.             a = findRoot(a); 
  254.             b = findRoot(b); 
  255.             if(a != b) 
  256.                 tree[a] = b; 
  257.         } 
  258.         int ans = 0; 
  259.         for(i=1; i<=n; ++i) 
  260.             if(tree[i] == -1) ++ans; 
  261.         cout<<--ans<<endl; 
  262.     } 
  263.  
  264.  
  265. int sum[N];  //只有当tree[i]中的值为真时候才有效 
  266. //涉及到求并查集中的元素个数 
  267. void main55() 
  268.     int n; 
  269.     while(cin>>n) 
  270.     { 
  271.         for(int i=0; i<N; ++i) 
  272.         { 
  273.             tree[i] = -1; 
  274.             sum[i] = 1; 
  275.         } 
  276.  
  277.         while(n--) 
  278.         { 
  279.             int a,b; 
  280.             cin>>a>>b; 
  281.             a = findRoot(a); 
  282.             b = findRoot(b); 
  283.             if(a != b) 
  284.             { 
  285.                 tree[a] = b; 
  286.                 sum[b] += sum[a]; 
  287.             } 
  288.         } 
  289.         int ans = 0; 
  290.         for(i=1; i<=N; ++i) 
  291.         { 
  292.             if(tree[i] == -1 && sum[i] > ans) 
  293.                 ans = sum[i]; 
  294.         } 
  295.         cout<<ans<<endl; 
  296.     } 
  297.  
  298. struct Edge1 
  299.     int a,b,cost; 
  300.     bool operator < (struct Edge1 e) 
  301.     { 
  302.         return cost < e.cost; 
  303.     } 
  304. }edge[N]; 
  305.  
  306. void main56() 
  307.     int n; 
  308.     while(cin>>n) 
  309.     { 
  310.         for(int i=1; i<=n*(n-1)/2; ++i) 
  311.             cin>>edge[i].a>>edge[i].b>>edge[i].cost; 
  312.         sort(edge+1,edge+1+n*(n-1)/2); 
  313.         for(i=0; i<N; ++i) 
  314.             tree[i] = -1; 
  315.         int ans = 0; 
  316.         for(i=1; i<=n*(n-1)/2; ++i) 
  317.         { 
  318.             int a = edge[i].a; 
  319.             int b = edge[i].b; 
  320.             a = findRoot(a); 
  321.             b = findRoot(b); 
  322.             if(a != b) 
  323.             { 
  324.                 tree[a] = b; 
  325.                 ans += edge[i].cost; 
  326.             } 
  327.         } 
  328.         cout<<ans<<endl; 
  329.     } 
  330.  
  331. struct Edge2 
  332.     int a,b; 
  333.     double cost; 
  334.     bool operator < (const Edge2 &e) const 
  335.     { 
  336.         return cost < e.cost; 
  337.     } 
  338. }edge2[N]; 
  339. struct Point 
  340.     double x,y; 
  341.     double getDistance(Point p) 
  342.     { 
  343.         return sqrt(pow(abs(x-p.x),2)+pow(abs(y-p.y),2)); 
  344.     } 
  345. }list1[N]; 
  346.  
  347. void main57() 
  348.     int n; 
  349.     while(cin>>n) 
  350.     { 
  351.         for(int i=1; i<=n; ++i) 
  352.             cin>>list1[i].x>>list1[i].y; 
  353.         int size = 0; 
  354.         for(i=1; i<=n; ++i) 
  355.         { 
  356.             for(int j=i+1; j<=n; ++j) 
  357.             { 
  358.                 edge2[size].a = i; 
  359.                 edge2[size].b = j; 
  360.                 edge2[size].cost = list1[i].getDistance(list1[j]); 
  361.                 ++size; 
  362.             } 
  363.         } 
  364.         sort(edge2+1,edge2+size); 
  365.         for(i=0; i<=N; ++i) 
  366.             tree[i] = -1; 
  367.         double ans = 0; 
  368.         for(i=0; i<size; ++i) 
  369.         { 
  370.             int a = findRoot(edge2[i].a); 
  371.             int b = findRoot(edge2[i].b); 
  372.             if(a != b) 
  373.             { 
  374.                 tree[a] = b; 
  375.                 ans += edge2[i].cost; 
  376.             } 
  377.         } 
  378.         printf("%.2lf\n",ans); 
  379.     //  cout<<setprecision(2)<<ans<<endl; 
  380.     } 
  381.  
  382. int ans[N][N];  //利用一个矩阵保存图,边达不到则为-1 
  383.  
  384. void main58() 
  385.     int n,m; 
  386.     while(cin>>n>>m && n && m) 
  387.     { 
  388.         for(int i=1; i<=n; ++i) 
  389.         { 
  390.             for(int j=1; j<=n; ++j) 
  391.                 ans[i][j] = -1; 
  392.             ans[i][i] = 0; 
  393.         } 
  394.         while(m--) 
  395.         { 
  396.             int a,b,c; 
  397.             cin>>a>>b>>c; 
  398.             ans[a][b] = ans[b][a] = c;   //此式中为无向图 
  399.         } 
  400.         for(int k=1; k<=n; ++k) 
  401.         { 
  402.             for(i=1; i<=n; ++i) 
  403.                 for(int j=1; j<=n; ++j) 
  404.                     if(ans[i][k]==-1 || ans[k][j] == -1) 
  405.                         continue;                    
  406.                     else if(ans[i][j] == -1 || ans[i][k] + ans[k][j] < ans[i][j]) 
  407.                         ans[i][j] = ans[i][k] + ans[k][j]; 
  408.         } 
  409.         cout<<ans[1][n]<<endl; 
  410.     }    
  411.  
  412. struct E 
  413.     int node; 
  414.     int cost; 
  415. }; 
  416.  
  417. vector<E> vEdge[N]; 
  418. bool mark[N]; 
  419. int dist[N]; 
  420.  
  421. void main59() 
  422.     int n,m; 
  423.     while(cin>>n>>m && n && m) 
  424.     { 
  425.         for(int i=0; i<N; ++i) vEdge[i].clear(); 
  426.         while(m--) 
  427.         { 
  428.             int a,b,c; 
  429.             cin>>a>>b>>c; 
  430.             E tmp; 
  431.             tmp.cost = c; 
  432.             tmp.node = b; 
  433.             vEdge[a].push_back(tmp); 
  434.             tmp.node = a; 
  435.             vEdge[b].push_back(tmp); 
  436.         } 
  437.  
  438.         for(i=0; i<N; ++i) 
  439.         { 
  440.             dist[i] = -1; 
  441.             mark[i] = false
  442.         } 
  443.         dist[1] = 0; 
  444.         mark[1] = true
  445.         int newP = 1;   //初始节点 
  446.         for(i=1; i<n; ++i) 
  447.         { 
  448.             for(int j=0; j<vEdge[i].size(); ++j) 
  449.             { 
  450.                 int t = vEdge[newP][j].node; 
  451.                 int c = vEdge[newP][j].cost; 
  452.  
  453.                 if(mark[t]) continue
  454.                 if(dist[t] == -1 || dist[newP] + c < dist[t])                
  455.                     dist[t] = dist[newP] + c;                                                        
  456.             } 
  457.             int min = 123123123; 
  458.             for(j=1; j<=n; ++j) 
  459.             { 
  460.                 if(mark[i] || dist[j] == -1) continue
  461.                 if(dist[j]  < min) 
  462.                 { 
  463.                     min = dist[j]; 
  464.                     newP = j; 
  465.                 } 
  466.             } 
  467.             mark[newP] = true
  468.         } 
  469.         cout<<dist[n]<<endl; 
  470.     } 
  471.  
  472. //字符串替换函数 
  473. void replace(char str[],char key[],char swap[]) 
  474.     int l1,l2,l3,i,j,flag; 
  475.     char tmp[100]; 
  476.     l1 = strlen(str); 
  477.     l2 = strlen(key); 
  478.     l3 = strlen(swap); 
  479.  
  480.     for(i=0; i<=l1-l2; ++i) 
  481.     {    
  482.         flag = 1; 
  483.         for(j=0; j<l2; ++j) 
  484.             if(str[i+j] != key[j]) 
  485.             { 
  486.                 flag = 0; 
  487.                 break
  488.             } 
  489.         if(flag) 
  490.         { 
  491.             strcpy(tmp,str); 
  492.             strcpy(tmp+i,swap); 
  493.             strcpy(tmp+i+l3,str+l2+i); 
  494.             strcpy(str,tmp); 
  495.             i += l3-1;          //不要忘了for循环中有++i操作 
  496.             l1 = strlen(str); 
  497.         } 
  498.     } 
  499.  
  500. void main60() 
  501.     char str[100] = "rei wreant treo replace re"
  502.     char key[100] = "re"
  503.     char swap[100] = "no"
  504.     replace(str,key,swap); 
  505.     cout<<str<<endl; 
  506.  
  507. int BFMatch(char *s,char *p) 
  508.     int i=0,j; 
  509.      
  510.     while(i<=strlen(s)-strlen(p)) 
  511.     { 
  512.         j=0; 
  513.         while(s[i] == p[j] && j<strlen(p))  
  514.         { 
  515.             ++i; 
  516.             ++j; 
  517.         } 
  518.         if(j == strlen(p)) 
  519.             return i-j; 
  520.         i = i-j+1; 
  521.     } 
  522.     return -1; 
  523.  
  524. void main61() 
  525.     char s1[100] = "i need to find a str in this"
  526.     char s2[100] = "str"
  527.     cout<<BFMatch(s1,s2)<<endl; 
  528.  
  529. void getnext(char *p,int *next) 
  530.     int j=0,k=-1; 
  531.     next[j] = k; 
  532.     while(j<strlen(p)-1) 
  533.     { 
  534.         if(k==-1 || p[j] == p[k]) 
  535.         { 
  536.             ++k; 
  537.             ++j; 
  538.             next[j] = k; 
  539.         }else 
  540.             k = next[k]; 
  541.     } 
  542.  
  543. int KMPMatch(char *s,char *p) 
  544.     int next[N]; 
  545.     int i=0,j=0;       //i用来遍历s主串,j用来遍历模式串 
  546.  
  547.     getnext(p,next); 
  548.     while(i<strlen(s)) 
  549.     { 
  550.         if(j==-1 || p[j] == s[i]) 
  551.         { 
  552.             ++j; 
  553.             ++i; 
  554.         }else 
  555.             j = next[j]; 
  556.         if(j == strlen(p)) 
  557.             return i-j; 
  558.     } 
  559.     return -1; 
  560. void main62() 
  561.     char ch[100] = "asbabcababa"
  562.     char c[100] = "aba"
  563. //  copy(next,next+100,ostream_iterator<int>(cout," "));     
  564.     cout<<KMPMatch(ch,c)<<endl; 
  565.  
  566. struct Edge3 
  567.     int node,cost,c; 
  568. }; 
  569.  
  570. vector<Edge3> vE[N]; 
  571.   
  572. int cost1[N]; 
  573.   
  574.  
  575. void main63() 
  576.     int n,m; 
  577.     int S,T; 
  578.     while(cin>>n>>m && n && m) 
  579.     { 
  580.         for(int i=0; i<N; ++i) vE[i].clear(); 
  581.         while(m--) 
  582.         { 
  583.             int a,b,c,cost; 
  584.             cin>>a>>b>>c>>cost; 
  585.             Edge3 tmp; 
  586.             tmp.c = c; 
  587.             tmp.cost = cost; 
  588.             tmp.node = b; 
  589.             vE[a].push_back(tmp); 
  590.             tmp.node = a; 
  591.             vE[b].push_back(tmp); 
  592.         } 
  593.         cin>>S>>T; 
  594.         for(i=0; i<N; ++i) 
  595.         { 
  596.             mark[i] = false
  597.             dist[i] = -1; 
  598.             cost1[i] = 0; 
  599.         } 
  600.         int newP = S; 
  601.         mark[newP] = true
  602.         dist[newP] = 0; 
  603.  
  604.         for(i=1; i<n; ++i) 
  605.         { 
  606.             for(int j=0; j<vE[newP].size(); ++j) 
  607.             { 
  608.                 int t = vE[newP][j].node; 
  609.                 int c = vE[newP][j].c; 
  610.                 int co = vE[newP][j].cost; 
  611.                 if(!mark[t]) 
  612.                 { 
  613.                     if(dist[t] == -1 || dist[newP] + c < dist[t] || (dist[newP] + c == dist[t] && cost1[newP] + co < cost1[t])) 
  614.                     { 
  615.                         dist[t] = c+dist[newP]; 
  616.                         cost1[t] = co + cost1[newP]; 
  617.                     } 
  618.                 } 
  619.             } 
  620.             int min = 123123123; 
  621.             for(j=1; j<=n; ++j) 
  622.             { 
  623.                 if(!mark[j] && dist[j] != -1) 
  624.                 { 
  625.                     if(dist[j] < min) 
  626.                     { 
  627.                         newP = j; 
  628.                         min = dist[j]; 
  629.                     } 
  630.                 } 
  631.             } 
  632.             mark[newP] = true
  633.         } 
  634.  
  635.         cout<<dist[T]<<"  "<<cost1[T]<<endl; 
  636.     } 
  637.  
  638. vector<int> iv[N];      //拓扑排序适合使用链表表示法 
  639.  
  640. queue<int>  q; 
  641.  
  642. void main64() 
  643.     int inDegree[N]; 
  644.     int n,m; 
  645.     while(cin>>n>>m && n && m) 
  646.     { 
  647.         for(int i=0; i<N; ++i) 
  648.         { 
  649.             iv[i].clear(); 
  650.             inDegree[i] = 0; 
  651.         } 
  652.         while(m--) 
  653.         { 
  654.             int a,b; 
  655.             cin>>a>>b; 
  656.             ++inDegree[b]; 
  657.             iv[a].push_back(b);         //有向树 
  658.         } 
  659.         while(!q.empty()) q.pop();      //清空 
  660.         for(i=0; i<n; ++i) 
  661.             if(inDegree[i] == 0)  
  662.                 q.push(i); 
  663.         int cnt = 0; 
  664.         while(!q.empty()) 
  665.         { 
  666.             int newP = q.front(); 
  667.             q.pop(); 
  668.             ++cnt; 
  669.             for(i=0; i<iv[newP].size(); ++i) 
  670.             { 
  671.                 int k=iv[newP][i]; 
  672.                 if(--inDegree[k] == 0) 
  673.                 { 
  674.                     q.push(k); 
  675.                 }                
  676.             } 
  677.         } 
  678.          
  679.         if(cnt == n) 
  680.             cout<<"yes"<<endl; 
  681.         else cout<<"no"<<endl; 
  682.     } 
  683.   

 

你可能感兴趣的:(C++,算法,STL)