zoukankan      html  css  js  c++  java
  • Gym

    题意:n个点,给定起点和终点,可以每次可以走一格或两格,走一格则需要一个代价,每个格子只能走一次,问从起点到终点并经过每一个点的最小代价

    思路:这题我没看出什么道理,先打了个暴力,结果发现了个相当坑的规律,,然后就过了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <fstream>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <deque>
     7 #include <vector>
     8 #include <queue>
     9 #include <string>
    10 #include <cstring>
    11 #include <map>
    12 #include <stack>
    13 #include <set>
    14 #define LL long long
    15 #define eps 1e-8
    16 #define INF 0x3f3f3f3f
    17 #define MAXN 200005
    18 using namespace std;
    19 int main()
    20 {
    21 #ifndef ONLINE_JUDGE
    22     freopen("in.txt", "r", stdin);
    23     freopen("out.txt", "w", stdout);
    24 #endif // OPEN_FILE
    25     int n, s, t, o;
    26     while(~scanf("%d%d%d", &n, &s, &t)){
    27         //printf("%d %d %d %d ", n, s, t, o);
    28         int ans;
    29         if(s == t){
    30             ans = 2;
    31         }
    32         else{
    33             if(s > t){
    34                 swap(s, t);
    35             }
    36             if(t - s == 1){
    37                 if(s != 1 && t != n){
    38                     ans = -1;
    39                 }
    40                 else{
    41                     ans = 1;
    42                 }
    43             }
    44             else{
    45                 int tt = n -s + 1;
    46                 int ss = n - t + 1;
    47                 if(ss < s){
    48                     s = ss;
    49                     t = tt;
    50                 }
    51                 int p;
    52                 if(s == 1){
    53                     p = t - s - 1;
    54                     ans = 1 + p / 3 + (p % 3);
    55                 }
    56                 else{
    57                     p = t - s - 2;
    58                     ans = 2 + p / 3  + (p % 3);
    59                 }
    60             }
    61         }
    62         if(s == 1 && t == n && n % 3 == 1){
    63             ans -= 2;
    64         }
    65         printf("%d
    ", ans);
    66     }
    67     /*while(~scanf("%d%d%d", &n, &s, &t)){
    68         memset(vis, 0, sizeof(vis));
    69         vis[s] = true;
    70         vis[t] = true;
    71         ans = INF;
    72         dfs(s, 0, 0);
    73         if(ans == INF){
    74             printf("%d %d %d -1
    ", n, s, t);
    75             continue;
    76         }
    77         printf("%d %d %d %d
    ", n, s, t, ans);
    78     }*/
    79 }

    下面是暴力的

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <fstream>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <deque>
     7 #include <vector>
     8 #include <queue>
     9 #include <string>
    10 #include <cstring>
    11 #include <map>
    12 #include <stack>
    13 #include <set>
    14 #define LL long long
    15 #define eps 1e-8
    16 #define INF 0x3f3f3f3f
    17 #define MAXN 200005
    18 int n, s, t;
    19 int ans;
    20 bool vis[MAXN];
    21 using namespace std;
    22 void dfs(int x, int cnt, int cost){
    23     if(cnt == n - 2){
    24         if(abs(x - t) == 1){
    25             ans = min(ans, cost + 1);
    26         }
    27         else if(abs(x - t) == 2){
    28             ans = min(ans, cost);
    29         }
    30         else{
    31             return;
    32         }
    33     }
    34     int y;
    35     for(int i = 1; i <= 2; i++){
    36         int p = i == 1 ? 1 : 0;
    37         y = x + i;
    38         if(y >= 1 && y <= n && !vis[y]){
    39             vis[y] = true;
    40             dfs(y, cnt + 1, cost + p);
    41             vis[y] = false;
    42         }
    43         y = x - i;
    44         if(y >= 1 && y <= n && !vis[y]){
    45             vis[y] = true;
    46             dfs(y, cnt + 1, cost + p);
    47             vis[y] = false;
    48         }
    49     }
    50 }
    51 int main()
    52 {
    53 #ifndef ONLINE_JUDGE
    54     freopen("in.txt", "r", stdin);
    55     //freopen("out.txt", "w", stdout);
    56 #endif // OPEN_FILE
    57 
    58     while(~scanf("%d%d%d", &n, &s, &t)){
    59         memset(vis, 0, sizeof(vis));
    60         vis[s] = true;
    61         vis[t] = true;
    62         ans = INF;
    63         dfs(s, 0, 0);
    64         if(ans == INF){
    65             printf("-1
    ");
    66             return 0;
    67         }
    68         printf("%d
    ", ans);
    69     }
    70 }
  • 相关阅读:
    Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)
    Spring Boot 中初始化资源的几种方式(转)
    关于RedisTemplate和StringRedisTemplate(转)
    @PostConstruct
    Python % 格式化字符串
    逻辑回归模型
    python 常用内置函数
    HIVE: collect_set(输出未包含在groupby的字段);
    HDFS文件和HIVE表的一些操作
    Linux 传输文件
  • 原文地址:https://www.cnblogs.com/macinchang/p/4734864.html
Copyright © 2011-2022 走看看