zoukankan      html  css  js  c++  java
  • codeforces#516 Div2---ABCD

    A---Make a triangle!

    http://codeforces.com/contest/1064/problem/A

    题意:

    给定三个整数表示三角形的边。每次给边长可以加一,问至少要加多少才能使这三个边成为一个三角形。

    思路:

    找到最大的边,然后最大边 + 1减剩下两条边就行了。负数的话就是0。

     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<stdio.h>
     5 #include<cstring>
     6 #include<vector>
     7 #include<map>
     8 #include<set>
     9 #include<bits/stdc++.h>
    10 
    11 #define inf 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long LL;
    14 
    15 int a, b, c;
    16 
    17 int main(){
    18 
    19     while(scanf("%d%d%d", &a, &b, &c) != EOF){
    20         int m = max(a, b);
    21         m = max(m, c);
    22         int ans = 0;
    23         if(m == a){
    24             if(b + c > m){
    25                 ans = 0;
    26             }
    27             else{
    28                 ans = m + 1 - b - c;
    29             }
    30         }
    31         else if(m == b){
    32             if(a + c > m){
    33                 ans = 0;
    34             }
    35             else{
    36                 ans = m + 1 - a - c;
    37             }
    38         }
    39         else{
    40             if(a + b > m){
    41                 ans = 0;
    42             }
    43             else{
    44                 ans = m + 1 - a - b;
    45             }
    46         }
    47         printf("%d
    ", ans);
    48     }
    49     return 0;
    50 }
    View Code

    B---Equations of Mathematical Magic

    http://codeforces.com/contest/1064/problem/B

    题意:

    给定一个a, 使得a - (a ^ x) - x = 0.问能有多少的x。

    思路:

    如果a的某一位是1, x的这一位是1,那么a^x这一位是0,a-(a^x)-x这一位是0

    如果a的某一位是1, x的这一位是0, 那么a^x这一位是1,a-(a^x)-x这一位是0

    如果a的某一位是0, x的这一位是1, 那么a^x这一位是1,a-(a^x)-x这一位是1

    如果a的某一位是0, x的这一位是0,那么a^x这一位是0,a-(a^x)-x这一位是0

    所以统计一下a的1的个数

     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<stdio.h>
     5 #include<cstring>
     6 #include<vector>
     7 #include<map>
     8 #include<set>
     9 #include<bits/stdc++.h>
    10 
    11 #define inf 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long LL;
    14 
    15 int t;
    16 LL a;
    17 
    18 int main(){
    19 
    20     while(scanf("%d", &t) != EOF){
    21         for(int i = 0; i < t; i++){
    22             scanf("%I64d", &a);
    23             LL cnt = 1;
    24             while(a){
    25                 if(a & 1){
    26                     cnt <<= 1;
    27                 }
    28                 a >>= 1;
    29             }
    30 
    31             printf("%I64d
    ", cnt);
    32         }
    33 
    34     }
    35 
    36 
    37     return 0;
    38 }
    View Code

    C---Oh Those Palindromes

    http://codeforces.com/contest/1064/problem/C

    题意:

    给定一个字符串,使得他的是回文的子串数目最多,问应如何重新排列这个字符串。

    思路:

    让同一个字母都放在一起,输出就行了。sort一下就行,但是我竟然还统计了一下个数,蠢了。

     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<stdio.h>
     5 #include<cstring>
     6 #include<vector>
     7 #include<map>
     8 #include<set>
     9 #include<bits/stdc++.h>
    10 
    11 #define inf 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long LL;
    14 
    15 int n;
    16 const int maxn = 1e5 + 5;
    17 char str[maxn];
    18 int cnt[30];
    19 
    20 
    21 int main(){
    22 
    23     while(scanf("%d", &n) != EOF){
    24         //scanf("%s", str);
    25         cin>>str;
    26         memset(cnt, 0, sizeof(cnt));
    27         for(int i = 0; i < n; i++){
    28             cnt[str[i] - 'a']++;
    29         }
    30         for(int i = 0; i < 26; i++){
    31             for(int j = 0; j < cnt[i]; j++){
    32                 printf("%c", i+'a');
    33             }
    34         }
    35         printf("
    ");
    36     }
    37     return 0;
    38 }
    View Code

    D---Labyrinth

    http://codeforces.com/contest/1064/problem/D

    题意:

    一个n*m的格子,有的格子有障碍不能经过。现在从(r, c)处出发,向左最多只能走x次,向右最多走y次,问可以到达的格子有多少个。

    思路:

    最开始想的是dfs直接更新啥的。但是由于有先后顺序的问题,所以更新的时候左右的次数是不能直接减1的。需要用数组记录一下最大的左右次数。

    而且如果发现vis过了这个格子就不更新了的话,也还是有先后顺序的问题。只有当经过这个格子的左右次数比原来大的时候才继续dfs更新这个格子。

    但是这样dfs会T。

    czc bfs过了,明天试一下....

    先贴一下T了的代码。

     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<stdio.h>
     5 #include<cstring>
     6 #include<vector>
     7 #include<map>
     8 #include<set>
     9 #include<bits/stdc++.h>
    10 
    11 #define inf 0x3f3f3f3f
    12 using namespace std;
    13 typedef long long LL;
    14 
    15 int n, m, r, c, x, y, cnt;
    16 const int maxn = 2005;
    17 bool vis[maxn][maxn];
    18 int leftl[maxn][maxn], leftr[maxn][maxn];
    19 int mvi[4] = {0, 0, 1, -1};
    20 int mvj[4] = {1, -1, 0, 0};
    21 bool g[maxn][maxn];
    22 
    23 
    24 void dfs(int posi, int posj)
    25 {
    26     if(!vis[posi][posj]){
    27         vis[posi][posj] = true;
    28         //cout<<posi<<" "<< posj<<endl;
    29         cnt++;
    30     }
    31     for(int k = 0; k < 4; k++){
    32         int di = posi + mvi[k];
    33         int dj = posj + mvj[k];
    34         int mostl,mostr;
    35         if(di > 0 && dj > 0 && di <= n && dj <= m && g[di][dj]){
    36             if(k == 0){//向右
    37                 mostr = leftr[posi][posj] - 1;
    38                 mostl = leftl[posi][posj];
    39                 if(mostr > leftr[di][dj] && mostr >= 0){
    40                     leftr[di][dj] = mostr;
    41                     leftl[di][dj] = mostl;
    42                     dfs(di, dj);
    43                 }
    44             }
    45             else if(k == 1){
    46                 mostl = leftl[posi][posj] - 1;
    47                 mostr = leftr[posi][posj];
    48                 if(mostl > leftl[di][dj] && mostl >= 0){
    49                     leftl[di][dj] = mostl;
    50                     leftr[di][dj] = mostr;
    51                     dfs(di, dj);
    52                 }
    53             }
    54             else{
    55                 mostl = leftl[posi][posj];
    56                 mostr = leftr[posi][posj];
    57                 if(mostl > leftl[di][dj]){
    58                     leftl[di][dj] = mostl;
    59                     leftr[di][dj] = mostr;
    60                     dfs(di, dj);
    61                 }
    62             }
    63         }
    64     }
    65 }
    66 
    67 int main(){
    68 
    69     while(scanf("%d%d", &n, &m) != EOF){
    70         scanf("%d%d", &r, &c);
    71         scanf("%d%d", &x, &y);
    72         cnt = 0;
    73         memset(vis, 0, sizeof(vis));
    74         memset(leftr, -1, sizeof(leftr));
    75         memset(leftl, -1, sizeof(leftl));
    76 
    77         for(int i = 1; i <= n; i++){
    78             char str[maxn];
    79             scanf("%s", str);
    80             for(int j = 0; j < m; j++){
    81                 if(str[j] == '*'){
    82                     g[i][j + 1] = false;
    83                 }
    84                 else{
    85                     g[i][j + 1] = true;
    86                 }
    87             }
    88         }
    89 
    90         leftl[r][c] = x;
    91         leftr[r][c] = y;
    92         dfs(r, c);
    93         printf("%d
    ", cnt);
    94     }
    95     return 0;
    96 }
    View Code

     bfs写的 1A代码

      1 #include<iostream>
      2 #include<cmath>
      3 #include<algorithm>
      4 #include<stdio.h>
      5 #include<cstring>
      6 #include<vector>
      7 #include<map>
      8 #include<set>
      9 #include<bits/stdc++.h>
     10 
     11 #define inf 0x3f3f3f3f
     12 using namespace std;
     13 typedef long long LL;
     14 
     15 int n, m, r, c, x, y, cnt;
     16 const int maxn = 2005;
     17 bool vis[maxn][maxn];
     18 int leftl[maxn][maxn], leftr[maxn][maxn];
     19 int mvi[4] = {0, 0, 1, -1};
     20 int mvj[4] = {1, -1, 0, 0};
     21 bool g[maxn][maxn];
     22 
     23 
     24 void dfs(int posi, int posj)
     25 {
     26     if(!vis[posi][posj]){
     27         vis[posi][posj] = true;
     28         //cout<<posi<<" "<< posj<<endl;
     29         cnt++;
     30     }
     31     for(int k = 0; k < 4; k++){
     32         int di = posi + mvi[k];
     33         int dj = posj + mvj[k];
     34         int mostl,mostr;
     35         if(di > 0 && dj > 0 && di <= n && dj <= m && g[di][dj]){
     36             if(k == 0){//ÏòÓÒ
     37                 mostr = leftr[posi][posj] - 1;
     38                 mostl = leftl[posi][posj];
     39                 if(mostr > leftr[di][dj] && mostr >= 0){
     40                     leftr[di][dj] = mostr;
     41                     leftl[di][dj] = mostl;
     42                     dfs(di, dj);
     43                 }
     44             }
     45             else if(k == 1){
     46                 mostl = leftl[posi][posj] - 1;
     47                 mostr = leftr[posi][posj];
     48                 if(mostl > leftl[di][dj] && mostl >= 0){
     49                     leftl[di][dj] = mostl;
     50                     leftr[di][dj] = mostr;
     51                     dfs(di, dj);
     52                 }
     53             }
     54             else{
     55                 mostl = leftl[posi][posj];
     56                 mostr = leftr[posi][posj];
     57                 if(mostl > leftl[di][dj]){
     58                     leftl[di][dj] = mostl;
     59                     leftr[di][dj] = mostr;
     60                     dfs(di, dj);
     61                 }
     62             }
     63         }
     64     }
     65 }
     66 
     67 struct node{
     68     int i, j;
     69     node(){}
     70     node(int _i, int _j):i(_i), j(_j){}
     71 };
     72 
     73 void bfs()
     74 {
     75     queue<node>que;
     76     que.push(node(r, c));
     77     vis[r][c] = true;
     78     cnt = 1;
     79     while(!que.empty()){
     80         node now = que.front();
     81         que.pop();
     82         for(int k = 0; k < 4; k++){
     83             int di = now.i + mvi[k], dj = now.j + mvj[k];
     84             if(di > 0 && di <= n && dj > 0 && dj <= m && g[di][dj]){
     85                 /*if(!vis[di][dj]){
     86                     vis[di][dj] = true;
     87                     cnt++;
     88                 }*/
     89                 if(k == 0){
     90                     int mostl = leftl[now.i][now.j], mostr = leftr[now.i][now.j] - 1;
     91                     if(mostr >= 0 && !vis[di][dj]){
     92                         vis[di][dj] = true;
     93                         cnt++;
     94                     }
     95                     if(mostr >= 0 && mostr > leftr[di][dj]){
     96                         que.push(node(di, dj));
     97                         leftl[di][dj] = mostl;
     98                         leftr[di][dj] = mostr;
     99                     }
    100                 }
    101                 else if(k == 1){
    102                     int mostl = leftl[now.i][now.j] - 1, mostr = leftr[now.i][now.j];
    103                     if(mostl >= 0 && !vis[di][dj]){
    104                         vis[di][dj] = true;
    105                         cnt++;
    106                     }
    107                     if(mostl >= 0 && mostl > leftl[di][dj]){
    108                         que.push(node(di, dj));
    109                         leftl[di][dj] = mostl;
    110                         leftr[di][dj] = mostr;
    111                     }
    112                 }
    113                 else{
    114                     int mostl = leftl[now.i][now.j], mostr = leftr[now.i][now.j];
    115                     if(!vis[di][dj]){
    116                         vis[di][dj] = true;
    117                         cnt++;
    118                     }
    119                     if(mostl > leftl[di][dj]){
    120                         que.push(node(di, dj));
    121                         leftl[di][dj] = mostl;
    122                         leftr[di][dj] = mostr;
    123                     }
    124                 }
    125             }
    126         }
    127     }
    128     printf("%d
    ", cnt);
    129 }
    130 
    131 int main(){
    132 
    133     while(scanf("%d%d", &n, &m) != EOF){
    134         scanf("%d%d", &r, &c);
    135         scanf("%d%d", &x, &y);
    136         cnt = 0;
    137         memset(vis, 0, sizeof(vis));
    138         memset(leftr, -1, sizeof(leftr));
    139         memset(leftl, -1, sizeof(leftl));
    140 
    141         for(int i = 1; i <= n; i++){
    142             char str[maxn];
    143             scanf("%s", str + 1);
    144             for(int j = 1; j <= m; j++){
    145                 if(str[j] == '*'){
    146                     g[i][j] = false;
    147                 }
    148                 else{
    149                     g[i][j] = true;
    150                 }
    151             }
    152         }
    153 
    154         leftl[r][c] = x;
    155         leftr[r][c] = y;
    156         bfs();
    157         //cout<<"!"<<endl;
    158         //dfs(r, c);
    159         //printf("%d
    ", cnt);
    160     }
    161     return 0;
    162 }
    View Code

    上了31分,ABC都卡了一下,C还RE了一发,还是太菜了啊。

  • 相关阅读:
    youtube视频下载
    Amazon 发送个人文档无回复
    逻辑地址、线性地址、物理地址
    niaoge.html
    Ubuntu中修改Terminal背景
    eclipse javaw.exe in your current path问题
    linux ls-al 指令详解
    sublime上配置markdown
    iOS Button按钮 热区的放大
    iOS抓包Charles 操作
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9788471.html
Copyright © 2011-2022 走看看