zoukankan      html  css  js  c++  java
  • 2016年江西理工大学C语言程序设计竞赛(高级组)

    比赛链接:http://oj.jxust.edu.cn/contest.php?cid=1159

    A.暴力

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 const int maxn = 1010;
     5 char s[maxn];
     6 int n;
     7  
     8 int main() {
     9     // freopen("in", "r", stdin);
    10     int T;
    11     scanf("%d", &T);
    12     while(T--) {
    13         memset(s, 0, sizeof(s));
    14         scanf("%s", s+1);
    15         n = strlen(s+1);
    16         int ret = 0;
    17         for(int i = 1; i <= n; i++) {
    18             if(s[i]=='j'&&s[i+1]=='x'&&s[i+2]=='u'&&s[i+3]=='s'&&s[i+4]=='t') ret++;
    19         }
    20         printf("%d
    ", ret);
    21     }
    22     return 0;
    23 }

    B.从大到小取模

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 const int maxn = 506000;
     5 int dp[maxn];
     6 int n;
     7  
     8 int main() {
     9     // freopen("in", "r", stdin);
    10     int T;
    11     scanf("%d", &T);
    12     while(T--) {
    13         scanf("%d", &n);
    14         int ret = 0;
    15         ret += n / 2000;
    16         n %= 2000;
    17         ret += n / 500;
    18         n %= 500;
    19         ret += n / 200;
    20         n %= 200;
    21         ret += n / 100;
    22         n %= 100;
    23         if(n != 0) puts("-1");
    24         else printf("%d
    ", ret);
    25     }
    26     return 0;
    27 }

    C.正着存一遍倒着存一遍求lcs,然后用总长减掉lcs。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 const int maxn = 1010;
     5 char s[maxn], e[maxn];
     6 int dp[maxn][maxn];
     7 int n;
     8  
     9 int main() {
    10     // freopen("in", "r", stdin);
    11     int T;
    12     scanf("%d", &T);
    13     while(T--) {
    14         memset(dp, 0, sizeof(dp));
    15         scanf("%s", s+1);
    16         n = strlen(s+1);
    17         for(int i = 1; i <= n; i++) e[i] = s[n-i+1];
    18         for(int i = 1; i <= n; i++) {
    19             dp[i][0] = 0;
    20             for(int j = 1; j <= n; j++) {
    21                 if(s[i] == e[j]) {
    22                     dp[i][j] = max(dp[i][j], dp[i-1][j-1]+1);
    23                 }
    24                 dp[i][j] = max(dp[i][j], max(dp[i-1][j], dp[i][j-1]));
    25             }
    26         }
    27         printf("%d
    ", n-dp[n][n]);
    28     }
    29     return 0;
    30 }

    D.展开后KMP

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 const int maxn = 21111;
     5 const int maxm = 98888888;
     6 int na, nb;
     7 char s[maxn];
     8 char a[maxm], b[maxn];
     9 int pre[maxn];
    10  
    11 void getpre(char *b, int *pre) {
    12     int j, k;
    13     pre[0] = -1;
    14     j = 0;
    15     k = -1;
    16     while(j < nb) {
    17         if(k == -1 || b[j] == b[k]) {
    18             j++;
    19             k++;
    20             pre[j] = k;
    21         }
    22         else k = pre[k];
    23     }
    24 }
    25  
    26 int kmp() {
    27     int ans = 0;
    28     int i = 0;
    29     int j = 0;
    30     getpre(b, pre);
    31     while(i < na) {
    32         if(j == -1 || a[i] == b[j]) {
    33             i++;
    34             j++;
    35         }
    36         else j = pre[j];
    37         if(j == nb) ans++;
    38     }
    39     return ans;
    40 }
    41 int main() {
    42     // freopen("in" ,"r", stdin);
    43     while(~scanf("%s", s)) {
    44         memset(a, 0, sizeof(a));
    45         na = 0;
    46         scanf("%s", b);
    47         nb = strlen(b);
    48         int len = strlen(s);
    49         int i = 0;
    50         int cnt;
    51         while(i < len) {
    52             if(s[i] >= '0' && s[i] <= '9') {
    53                 cnt = 0;
    54                 while(s[i] >= '0' && s[i] <= '9') {
    55                     cnt *= 10;
    56                     cnt += s[i] - '0';
    57                     i++;
    58                 }
    59             }
    60             else {
    61                 for(int j = 0; j < cnt; j++) a[na++] = s[i];
    62                 i++;
    63             }
    64         }
    65         printf("%d
    ", kmp());
    66     }
    67     return 0;
    68 }

    E.二维bitset<50000>(i,j)保存的是第i行,数字为j的列号状态,查询的时候把它们与起来count一下。

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <iomanip>
      4 #include <cstring>
      5 #include <climits>
      6 #include <complex>
      7 #include <cassert>
      8 #include <cstdio>
      9 #include <bitset>
     10 #include <vector>
     11 #include <deque>
     12 #include <queue>
     13 #include <stack>
     14 #include <ctime>
     15 #include <set>
     16 #include <map>
     17 #include <cmath>
     18 using namespace std;
     19 
     20 typedef pair<int, int> pii;
     21 const int maxm = 50500;
     22 const int maxn = 22;
     23 int G[maxm][maxn];
     24 int n, m, f, q;
     25 char query[1111];
     26 pii pos[1111];
     27 bitset<50000> status[maxn][maxn];
     28 
     29 inline bool scan_d(int &num) {
     30     char in; bool IsN = false;
     31     in = getchar();
     32     if (in == EOF) return false;
     33     while (in != '-' && (in<'0' || in>'9')) in = getchar();
     34     if (in == '-'){ IsN = true; num = 0; }
     35     else num = in - '0';
     36     while (in = getchar(), in >= '0'&&in <= '9'){
     37         num *= 10, num += in - '0';
     38     }
     39     if (IsN) num = -num;
     40     return true;
     41 }
     42 
     43 int main() {
     44     // freopen("test.in", "r", stdin);
     45     // freopen("out" ,"w", stdout);
     46     int T;
     47     scan_d(T);
     48     while (T--) {
     49         scan_d(n); scan_d(m);
     50         for (int i = 0; i < maxn; i++) {
     51             for (int j = 0; j < maxn; j++) {
     52                 status[i][j] = 0;
     53             }
     54         }
     55         for (int i = 1; i <= m; i++) {
     56             for (int j = 1; j <= n; j++) {
     57                 scan_d(G[i][j]);
     58                 status[j][G[i][j]][i] = 1;
     59             }
     60         }
     61         scan_d(f);
     62         int num, tmp;
     63         for (int i = 1; i <= f; i++) {
     64             scan_d(num);
     65             for (int j = 1; j <= num; j++) {
     66                 scan_d(tmp);
     67             }
     68         }
     69         scan_d(q);
     70         bitset<50000> cur;
     71         while (q--) {
     72             scanf("%s", query);
     73             int i = 0, len = strlen(query);
     74             int cnt = 0;
     75             while (i < len) {
     76                 if (query[i] >= '0' && query[i] <= '9') {
     77                     pii tmp = pii(0, 0);
     78                     while (query[i] >= '0' && query[i] <= '9') {
     79                         tmp.first *= 10;
     80                         tmp.first += query[i] - '0';
     81                         i++;
     82                     }
     83                     i++;
     84                     while (query[i] >= '0' && query[i] <= '9') {
     85                         tmp.second *= 10;
     86                         tmp.second += query[i] - '0';
     87                         i++;
     88                     }
     89                     pos[cnt++] = tmp;
     90                 }
     91                 i++;
     92             }
     93             cur = status[pos[0].first][pos[0].second];
     94             for (int j = 1; j < cnt; j++) {
     95                 cur &= status[pos[j].first][pos[j].second];
     96             }
     97             printf("%d
    ", cur.count());
     98         }
     99     }
    100     return 0;
    101 }

    F.判断两个矩形的距离,符合条件并查集并起来,计数。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3  
     4 typedef struct Square {
     5     int x, y, w, h; 
     6 }Square;
     7  
     8 const double eps = 1e-8;
     9 const int maxn = 1010;
    10 int n;
    11 double m;
    12 Square s[maxn];
    13  
    14 int pre[maxn];
    15 int find(int x) {
    16     return x == pre[x] ? x : pre[x] = find(pre[x]);
    17 }
    18 void unite(int x, int y) {
    19     x = find(x); y = find(y);
    20     if(x != y) pre[x] = y;
    21 }
    22  
    23 double pp(int x1, int y1, int x2, int y2) {
    24     int xx = x1 - x2;
    25     int yy = y1 - y2;
    26     return sqrt(xx*xx+yy*yy);
    27 }
    28  
    29 double dis(Square a, Square b) {
    30     int x11 = a.x, x12 = a.x + a.w;
    31     int y11 = a.y, y12 = a.y + a.h;
    32     int x21 = b.x, x22 = b.x + b.w;
    33     int y21 = b.y, y22 = b.y + b.h;
    34     double ret = 1e9;
    35     if((x11 >= x21 && x11 <= x22)||(x21 >= x11 && x21 <= x12)) {
    36         ret = min(ret, (double)abs(y11-y21));
    37         ret = min(ret, (double)abs(y11-y22));
    38         ret = min(ret, (double)abs(y12-y21));
    39         ret = min(ret, (double)abs(y12-y22));
    40     }
    41     if((y11 >= y21 && y11 <= y22)||(y21 >= y11 && y21 <= y12)) {
    42         ret = min(ret, (double)abs(x11-x21));
    43         ret = min(ret, (double)abs(x11-x22));
    44         ret = min(ret, (double)abs(x12-x21));
    45         ret = min(ret, (double)abs(x12-x22));
    46     }
    47     ret = min(ret, pp(x11, y11, x21, y21));
    48     ret = min(ret, pp(x11, y11, x22, y21));
    49     ret = min(ret, pp(x11, y11, x21, y22));
    50     ret = min(ret, pp(x11, y11, x22, y22));
    51     ret = min(ret, pp(x12, y11, x21, y21));
    52     ret = min(ret, pp(x12, y11, x22, y21));
    53     ret = min(ret, pp(x12, y11, x21, y22));
    54     ret = min(ret, pp(x12, y11, x22, y22));
    55     ret = min(ret, pp(x11, y12, x21, y21));
    56     ret = min(ret, pp(x11, y12, x22, y21));
    57     ret = min(ret, pp(x11, y12, x21, y22));
    58     ret = min(ret, pp(x11, y12, x22, y22));
    59     ret = min(ret, pp(x12, y12, x21, y21));
    60     ret = min(ret, pp(x12, y12, x22, y21));
    61     ret = min(ret, pp(x12, y12, x21, y22));
    62     ret = min(ret, pp(x12, y12, x22, y22));
    63     // cout << ret << endl;
    64     return ret;
    65 }
    66  
    67 bool ok(int i, int j) {
    68     return dis(s[i], s[j]) <= m;
    69 }
    70  
    71 int main() {
    72     // freopen("in", "r", stdin);
    73     while(~scanf("%d%lf",&n,&m)) {
    74         for(int i = 1; i <= n; i++) {
    75             scanf("%d%d%d%d",&s[i].x,&s[i].y,&s[i].w,&s[i].h);
    76         }
    77         for(int i = 1; i <= n; i++) pre[i] = i;
    78         for(int i = 1; i <= n; i++) {
    79             for(int j = i+1; j <= n; j++) {
    80                 if(ok(i, j)) unite(i, j);
    81             }
    82         }
    83         int ret = 0;
    84         for(int i = 1; i <= n; i++) {
    85             if(i == find(i)) ret++;
    86         }
    87         printf("%d
    ", ret);
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    Centos下Oracle11gR2安装教程与自动化配置脚本
    你知道CPU结构也会影响Redis性能吗?
    谈谈InnoDB中的B+树索引
    理论:第十一章:大厂程序员如何使用GitHub快速开发学习
    理论:第十四章:生产环境服务器变慢如何诊断,性能评估
    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案
    理论:第十二章:Dubbo的运行原理,支持什么协议,与SpringCould相比它为什么效率要高一些,Zookeeper底层原理
    理论:第十章:公平锁,非公平锁,可重入锁,递归锁,自旋锁,读写锁,悲观锁,乐观锁,行锁,表锁,死锁,分布式锁,线程同步锁分别是什么?
    理论:第九章:JVM内存模型,算法,垃圾回收器,调优,四大引用,常见的JVM错误,类加载机制(双亲委派),创建一个对象,这个对象在内存中是怎么分配的?
    理论:第八章:线程是什么,有几种实现方式,它们之间的区别是什么,线程池实现原理,JUC并发包,ThreadLocal与Lock和Synchronize区别
  • 原文地址:https://www.cnblogs.com/kirai/p/6131809.html
Copyright © 2011-2022 走看看