zoukankan      html  css  js  c++  java
  • HNCPC2012 总结

    A:因为是三位太太共同的 所以要平摊。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 #include <map>
     9 #include <stack>
    10 #include <list>
    11 #include <vector>
    12 #include <ctime>
    13 #define LL __int64
    14 #define eps 1e-8
    15 using namespace std;
    16 int jin(double x)
    17 {
    18      if(x - x/1 < 0.5)
    19         return x/1  ;
    20     else return x/1 +1; 
    21 }
    22 int main()
    23 {
    24     
    25     int n ; 
    26     scanf("%d",&n);
    27     for(int i = 1;i <= n;i++)
    28     {
    29         int x, y ,z ; 
    30         scanf("%d %d %d",&x,&y,&z);
    31         
    32      
    33         x = jin(1.0*x * z/(x+y) + 1.0*(x-y) *z/(x+y)); 
    34         y = z - x; 
    35         printf("%d
    ",x);
    36     }
    37     return 0;
    38 }
    View Code

    B:水模拟

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 #include <map>
     9 #include <stack>
    10 #include <list>
    11 #include <vector>
    12 #include <ctime>
    13 #define LL __int64
    14 #define eps 1e-8
    15 using namespace std;
    16 char str[10004];
    17 int sta[100005];
    18 int change(int l,int r)
    19 {
    20     int ans = 0 ;
    21     for(int i= l; i <= r ; i ++)
    22     {
    23         ans *= 10 ; 
    24         ans += str[i] - '0';
    25     }
    26     return ans;
    27 }
    28 int main()
    29 {
    30    int t ;
    31    scanf("%d",&t); 
    32    while(t--)
    33    {
    34        int n ;
    35     int s = 0 ; 
    36     scanf("%d",&n);
    37     for(int i = 1;i <= n;i++)
    38     {
    39      scanf("%s",str);
    40      if(str[0] == 'L')
    41      {
    42        sta[i] = 1; 
    43        s -- ;
    44      }
    45      else if(str[0] == 'R')
    46      {
    47        sta[i] = 0 ;
    48        s ++;
    49      }
    50      else {
    51 
    52         //int k = change(8,p);
    53         int k ; 
    54         scanf("%s",str);
    55         scanf("%d",&k);
    56         //printf("%d
    ",k);
    57         sta[i] = sta[k];
    58         if(sta[i])
    59         {
    60             s -- ;
    61         }else s ++ ;   
    62      }
    63     } 
    64     printf("%d
    ",s);
    65    }   
    66    return 0 ;
    67 }
    View Code

    C:细节题 ,用map代码量可能会少一点

      1 // File Name: c.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年10月07日 星期二 10时06分00秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 
     26 using namespace std;
     27 char bstr[1000];
     28 char str[200][5][200];
     29 char str1[200][5][200];
     30 int lstr; 
     31 int lstr1;
     32 void solve(char s[][5][200],int &num)
     33 {
     34      int p = 0 ;
     35      if(bstr[1] == '}')
     36          return;
     37 
     38      while(bstr[p] != '}')
     39      {
     40         //printf("%d
    ",p);
     41         num ++ ;
     42         int i ; 
     43         p ++ ; 
     44         for(i = p ;bstr[i] != ':' ;i ++) 
     45         {
     46             s[num][1][i-p] = bstr[i];    
     47         }
     48         //printf("%d %s",i,s[num][1]);    
     49         s[num][1][i-p] = '';
     50         p  = i+1 ; 
     51         //printf(" %s
    ",s[num][1]);    
     52         
     53         for(i = p ;bstr[i] != ','&& bstr[i] != '}';i ++) 
     54         {
     55             s[num][2][i-p] = bstr[i];
     56         }
     57     //    printf("%d
    ",p);        
     58         s[num][2][i-p] = '';
     59         p = i;  
     60      }
     61 }
     62 int srt[200];
     63 int srt1[200];
     64 int cmp(int a,int b)
     65 {
     66     if(strcmp(str[a][1],str[b][1]) < 0)
     67         return 1;
     68     return 0 ; 
     69 }
     70 int cmp1(int a,int b)
     71 {
     72     if(strcmp(str1[a][1],str1[b][1]) < 0)
     73         return 1;
     74     return 0 ; 
     75 }
     76 char *push[200];
     77 char *change[200];
     78 char *sub[200];
     79 int lp,lc,ls;
     80 int solve()
     81 {
     82    lp = lc = ls = 0;
     83    int p = 1 ; 
     84    for(int i = 1; i <= lstr1 ;i ++)
     85    {
     86        int ok = 0 ;
     87        int x = srt1[i];
     88        for(int j = p;j <= lstr; j ++)
     89        {
     90           int y = srt[j];
     91           if(strcmp(str[y][1],str1[x][1]) == 0 )
     92           {
     93              for(int s = p ;s < j;s ++)
     94              {
     95                 ls ++;
     96                 sub[ls] = str[srt[s]][1];
     97                //printf("%s
    ",str[srt[p]][1]);
     98              } 
     99              p = j+1;
    100              if(strcmp(str[y][2],str1[x][2]) != 0 )
    101              {
    102                 lc ++;
    103                 change[lc] = str[y][1];
    104              }
    105              ok = 1; 
    106              break;
    107           }
    108        }
    109        if(!ok)
    110        {
    111           lp ++ ;
    112           push[lp] = str1[x][1];
    113           //printf(" %d %s************************
    ",x,str1[x][1]);
    114        }
    115    }
    116    for(;p <= lstr; p ++)
    117    {
    118      ls ++ ; 
    119      sub[ls] = str[srt[p]][1];
    120      //printf("%s
    ",str[srt[p]][1]);
    121    }
    122    if(lp != 0 )
    123    {
    124      printf("+");
    125      for(int i = 1;i <= lp ;i ++)
    126          printf(i == 1?"%s":",%s",push[i]);
    127      printf("
    ");
    128    }
    129    if(ls != 0 )
    130    {
    131      printf("-");
    132      for(int i = 1;i <= ls ;i ++)
    133          printf(i == 1?"%s":",%s",sub[i]);
    134      printf("
    ");
    135    }
    136    if(lc != 0 )
    137    {
    138      printf("*");
    139      for(int i = 1;i <= lc ;i ++)
    140          printf(i == 1?"%s":",%s",change[i]);
    141      printf("
    ");
    142    }
    143    if(lp == 0 && ls == 0 && lc ==  0 )
    144    {
    145       return 0;    
    146    }
    147    return 1;
    148 }
    149 int main(){
    150   int n ; 
    151   scanf("%d",&n);
    152   while(n--)
    153   {
    154      lstr = 0 ; 
    155      lstr1 = 0 ;
    156      scanf("%s",bstr);
    157      solve(str,lstr);
    158      /*for(int i = 1;i <= lstr;i ++)
    159      {
    160        printf("%s %s ***",str[i][1],str[i][2]);
    161      }
    162      printf("***
    ");*/
    163      scanf("%s",bstr);
    164      solve(str1,lstr1);
    165      /*for(int i = 1;i <= lstr1;i ++)
    166      {
    167        printf("%s %s ***",str1[i][1],str1[i][2]);
    168      }*/
    169      for(int i =1;i <= lstr;i ++)
    170          srt[i] = i ; 
    171      sort(srt+1,srt+1+lstr,cmp);
    172      for(int i =1;i <= lstr1;i ++)
    173          srt1[i] = i ; 
    174      sort(srt1+1,srt1+1+lstr1,cmp1);
    175      if(!solve())
    176          printf("No changes
    ");
    177      printf("
    ");
    178   }
    179 return 0;
    180 }
    View Code

    D:从小数点后枚举这一位 是 0 ,还是  1  转换成大数浮点型 平方以后和 n 比较,确定这一位 ,一直确定到 130位就行

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <iostream>
      4 #include <sstream>
      5 #include <algorithm>
      6 #include <cmath>
      7 using namespace std;
      8 int a1[10010],a2[10010],b[10000],c[10000],l1,l2,s[110000];
      9 int l3,l4,l5,point,point2,point3,point1;
     10 char ans[1000];
     11 char ss[23];
     12 int chengfa()
     13 {
     14     int pos,i,j;
     15     memset(s,0,sizeof(s));
     16     for (i=1;i<=l4;i++)
     17         for (j=1,pos=i;j<=l4;j++)
     18             s[pos++]+=a2[i]*a2[j];
     19     pos-=1;
     20     for (i=1;i<=pos;i++)
     21     if (s[i]>=10)
     22     {
     23         if (i==pos) pos++;
     24         s[i+1]+=s[i]/10;
     25         s[i]%=10;
     26     }
     27     return pos;
     28 }
     29 void jia()
     30 {
     31     int p=1,i;
     32     if (point > point1)
     33     {
     34         for (i=1;i<=point - point1;i++)
     35             a2[p++]=a1[i];
     36         int tt=1;
     37         for (i=point - point1+1;i<=l1;i++)
     38             a2[p++]=a1[i]+c[tt++];
     39         point2=point;
     40     }
     41     else
     42     {
     43         for (i=1;i<=point1-point;i++)
     44             a2[p++]=c[i];
     45         int tt=i;
     46         for (i=1;i<=l1;i++)
     47             a2[p++]=a1[i]+c[tt++];
     48         point2=point1;
     49     }
     50     int kk=0;
     51     p--;
     52     for (i=1;i<=p;i++)
     53     {
     54         a2[i]+=kk;
     55         kk=a2[i]/10;
     56         a2[i]%=10;
     57     }
     58     if (kk!=0) a2[++p]=kk;
     59     l4=p;
     60 }
     61 int gobj()
     62 {
     63     int sl=l5,bl=l2;
     64     if (sl-point3>bl) return 1;
     65     else if (sl-point3<bl) return -1;
     66     while (sl>0 && bl>0)
     67     {
     68         if (s[sl]>b[bl]) return 1;
     69         if (s[sl]<b[bl]) return -1;
     70         sl--;bl--;
     71     }
     72     if (sl==0) return 0;
     73     else return 1;
     74 }
     75 int main()
     76 {
     77     int T,n;
     78     scanf("%d",&T);
     79     while (T--)
     80     {
     81         memset(ans,0,sizeof(ans));
     82         memset(a1,0,sizeof(a1));
     83         memset(a2,0,sizeof(a2));
     84         memset(c,0,sizeof(c));
     85         memset(b,0,sizeof(b));
     86         scanf("%d",&n);
     87         getchar();
     88         scanf("%s",&ss);
     89         int m=sqrt(n);
     90         int mm=m;
     91         int j=1;
     92         l1=0;
     93         point=0;
     94         while (mm)
     95         {
     96             a1[j++]=mm % 10;
     97             mm/=10;
     98             l1++;
     99         }
    100         point=0;
    101         mm=n;
    102         j=1;l2=0;
    103         while (mm)
    104         {
    105             b[j++]=mm%10;
    106             mm/=10;
    107             l2++;
    108         }
    109         c[1]=1;l3=1;
    110         int i;
    111         for (i=1;i<=130;i++)
    112         {
    113             for (j=1;j<=l3;j++)
    114                 c[j]*=5;
    115             int kk=0;
    116             for (j=1;j<=l3;j++)
    117             {
    118                 c[j]+=kk;
    119                 kk=c[j]/10;
    120                 c[j]=c[j]%10;
    121             }
    122             if (kk) c[++l3]=kk;
    123             point1=i;
    124             jia();
    125             /*for (j=l4;j>0;j--)
    126             {
    127                 if (point2==j) cout<<".";
    128                 printf("%d",a2[j]);
    129             }
    130             cout<<endl;*/
    131             l5=chengfa(); //平方后长度
    132             point3=2*point2; //平方后小数点位置
    133             /*for (j=l5;j>0;j--)
    134             {
    135                 if (point3==j) cout<<".";
    136                 printf("%d",s[j]);
    137             }
    138             cout<<endl;*/
    139             int re=gobj();
    140             if (re==1) //1:s>b -1:s<b
    141                 ans[i-1]='0';
    142             else if (re==-1)
    143             {
    144                 ans[i-1]='1';
    145                 memset(a1,0,sizeof(a1));
    146                 for (j=1;j<=l4;j++)
    147                     a1[j]=a2[j];
    148                 l1=l4;
    149                 point=point2;
    150             }
    151             else break;
    152         }
    153         for (j=i;j<=130;j++)
    154             ans[i]='0';
    155         ans[130]='';
    156         //cout<<ans<<endl;
    157         cout<<strstr(ans,ss) - ans << endl;
    158     }
    159     return 0;
    160 }
    View Code

    E:这题字典树或者 字符串排序(只对下标排序都行  见:http://www.cnblogs.com/zyue/p/4007476.html)

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 #include <map>
     9 #include <stack>
    10 #include <list>
    11 #include <vector>
    12 #include <ctime>
    13 #define LL __int64
    14 #define eps 1e-8
    15 using namespace std;
    16 string str[1005];
    17 int b[1005];
    18 bool cmp(int a, int b)
    19 {
    20      return str[a] < str[b];
    21 }
    22 int main()
    23 {
    24    int t ; 
    25    scanf("%d",&t);
    26    while(t--)
    27    {
    28          int n ; 
    29          scanf("%d",&n);
    30          for(int i = 1;i <= n;i ++)
    31             cin >> str[i] ;
    32          for(int i =1;i <= n;i ++)
    33            b[i] = i ; 
    34       sort(b+1,b+1+n,cmp);
    35      /* for(int i = 1;i <= n;i ++)
    36           printf("%d ",b[i]);
    37       printf("
    ");
    38        */   
    39       int k = 0 ;
    40       int tk ; 
    41       int ans = 0 ; 
    42       for(int i = 2;i <= n;i ++)
    43       {
    44            int len1 = str[b[i-1]].size();
    45            int len2 = str[b[i]].size();
    46            for(int j = 0 ;j < len1;j++)
    47            {
    48                  if(str[b[i-1]][j] != str[b[i]][j])
    49                  {
    50                        tk = j + 1;       
    51                       break;
    52                  }
    53          }
    54          ans += max(k,tk);
    55         //  printf("%d %d %d
    ",k,tk,ans);
    56          k = tk;  
    57           
    58       } 
    59       ans += k ; 
    60       printf("%d
    ",ans);
    61    }
    62    return 0 ;
    63 }
    View Code

    F:这个题我们可以看到 点数只有  16个点  我们可以 二进制枚举出要选点所有的情况以后 然后再用prime求出一种情况的答案。比较求得最大值

    不过这里有个地方要注意,两点之间可能有多条边,如果是连接矩阵的话要判断一下再加边入阵。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<map>
      4 #include<vector>
      5 #include<cmath>
      6 #include<cstdlib>
      7 #include<stack>
      8 #include<queue>
      9 #include <iomanip>
     10 #include<iostream>
     11 #include<algorithm>
     12 using namespace std ;
     13 const int inf = 1<<30 ;
     14 
     15 int n,m,k,tmp;
     16 int a[100],g[50][50],dist[100],vis[100],s[100];
     17 
     18 
     19 int work1()
     20 {
     21     int now ,pos=0,cost=0,MIN=inf,num;
     22     //memset(vis,0,sizeof(vis));
     23       for(int i = 0 ; i < tmp; i++ )
     24       {
     25                 now =s[i] ;   
     26               dist[now] = g[1][now] ;
     27                 vis[now]=0;
     28             //  printf("%d ",dist[now]) ;
     29       }  // puts("");
     30     vis[1]=1;num=0;
     31     for(int i = 1 ; i < tmp ; i++)
     32     {
     33           MIN=inf ;
     34            for(int j = 0 ; j < tmp;j++)
     35            {
     36                      now = s[j] ;
     37                      if(MIN > dist[now] && !vis[now]) 
     38                      {
     39                              MIN=dist[now] ;
     40                              pos=now ;
     41                      }
     42            } 
     43             cost += MIN ;  
     44             vis[pos]=1;
     45             for(int j = 0 ; j < tmp; j++)
     46             {
     47                    now= s[j] ;
     48                    if(dist[now] > g[pos][now] && !vis[now])
     49                        dist[now] = g[pos][now] ; 
     50             }
     51     }
     52     int sum = 0;
     53     for(int i = 0 ; i < tmp ; i++)
     54      {   now = s[i] ;
     55          sum += a[now] ;
     56          if(vis[now]) num++;
     57     }  
     58     if(cost <= k && num == tmp)  
     59      return sum ;
     60     else  return 0 ; 
     61 }
     62 
     63 int  print_subset(int x)
     64 {
     65      tmp =0 ;
     66   for(int i=0;i<n;i++)
     67    if(x&(1<<i))
     68    {
     69            s[tmp++]=i+1;
     70            
     71    }
     72    if(s[0]!=1 )
     73      return 0;
     74    else return 1;  
     75 }
     76 
     77 int main()
     78 {
     79        int t ,u,v,w;
     80        scanf("%d",&t) ;
     81        while(t--)
     82        {
     83                   scanf("%d%d%d",&n,&m,&k);
     84                   for(int i = 1 ; i <= n ; i++)
     85                     for(int j = 1 ; j <= n ;j++)
     86                       g[i][j]=inf ;
     87                   for(int i = 1 ; i <= n ; i++)
     88                     scanf("%d",&a[i]) ;   
     89                  
     90                   for(int i = 1 ; i <= m ; i++)
     91                   {
     92                            scanf("%d%d%d",&u,&v,&w) ;
     93                            if(g[u][v]>w)
     94                            g[u][v]=g[v][u]=w ;          
     95               }
     96               int ans = 0 ;
     97                      
     98                    for(int i=0;i<(1<<n);i++)
     99                 {
    100                    int flag = print_subset(i);
    101                         if(tmp==1)
    102                     {    
    103                       ans = max(ans,a[1]) ;
    104                       continue; 
    105                     } 
    106                       int ans1 ;
    107                       if(flag )
    108                           {  
    109                           ans1 = work1() ;
    110                           if(ans1 > ans)
    111                           {
    112                                 ans = ans1; 
    113                              /*     for(int j = 0 ; j < tmp ; j++)
    114                        printf("%d  ",s[j]) ;
    115                         puts("");  */
    116                           }
    117                          
    118                           } 
    119                       else  continue ;
    120                       
    121                     }
    122                 
    123                  printf("%d
    ",ans) ;
    124        } 
    125     return 0;
    126 } 
    View Code

    G:http://blog.csdn.net/keshuai19940722/article/details/35244875

     1 // File Name: uva12508.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年10月08日 星期三 09时45分37秒
     4 
     5 #include<vector>
     6 #include<list>
     7 #include<map>
     8 #include<set>
     9 #include<deque>
    10 #include<stack>
    11 #include<bitset>
    12 #include<algorithm>
    13 #include<functional>
    14 #include<numeric>
    15 #include<utility>
    16 #include<sstream>
    17 #include<iostream>
    18 #include<iomanip>
    19 #include<cstdio>
    20 #include<cmath>
    21 #include<cstdlib>
    22 #include<cstring>
    23 #include<ctime>
    24 #define LL long long
    25 #define eps 1e-8
    26 using namespace std;
    27 int n , m ;
    28 LL solve(int k)
    29 {
    30     LL sum = 0 ;  
    31     for(int i = 1 ;i <= n;i ++)
    32     {
    33         for(int j = 1;j <= m;j ++)
    34         {
    35             LL ans = 0 ;
    36             LL temp =0;
    37             if(i * j <= k )
    38             {
    39               temp = (j+1)*2 + (i+1) * 2 - 4;
    40               //有 4个重复计数了
    41             }
    42             
    43             ans += temp;
    44             temp = 0 ; 
    45             for(int x = 1; x <= i ; x ++)
    46             {
    47                 double t = (x*j - k)*1.0/i ;       
    48                 
    49                 int p = (x *1.0*j/i -eps);
    50                 int tt = t+ 1.0 - 1e-6;
    51                 
    52                 tt = max(tt,0);
    53                 if(x == i && tt ==  0 )
    54                    tt ++ ; 
    55                 temp += max(0,(p-tt+1));
    56             }
    57             temp *= 4; //对角线
    58             ans += temp;
    59             temp = 0 ; 
    60             for(int x = 1; x < i; x ++ )
    61             {
    62                int t = (k - i*j + x *j)/x;
    63                if(t >= 1)
    64                {
    65                   temp += min(j-1,t);
    66                }
    67             }
    68             
    69             temp *= 4;//第三种情况
    70             ans += temp;
    71             sum += ans*(n-i + 1)*(m-j+ 1);
    72         }
    73     }
    74     return sum;
    75 }
    76 int main(){
    77      int a, b ;
    78      int t; 
    79      scanf("%d",&t);
    80      while(t--)
    81      {
    82        scanf("%d %d %d %d",&n,&m,&a,&b);
    83        printf("%lld
    ",solve(b*2) - solve(a*2-1)) ;      
    84      }
    85 return 0;
    86 }
    View Code

     I:这个题目只有 5个石头 ,bfs和 dfs 相结合,dfs用来枚举石头,bfs 用来 枚举石头移动(只能移动一次)

      1 // File Name: uva12510.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年10月08日 星期三 19时13分59秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 
     26 using namespace std;
     27 int mp[12][12];
     28 int vis[12][12];
     29 int xadd[] = {1,-1,0,0};
     30 int yadd[] = {0,0,1,-1};
     31 struct node
     32 {
     33    int x;int y;
     34    int is;
     35    node(int _x, int _y, int _is)
     36    {
     37         x = _x; 
     38         y = _y;
     39         is = 0; 
     40    }
     41 };
     42 vector<node> C;
     43 int mx = 0;
     44 int ansnum = 0 ; 
     45 int n , m ;
     46 void debug()
     47 {
     48   for(int i = 1;i <= n;i ++)
     49   {
     50       for(int j = 1;j <= m;j ++)
     51           printf("%d ",mp[i][j]);
     52       printf("
    ");
     53   }
     54 }
     55 void bfs(int x, int y ,int ans)
     56 {
     57    if(mx == ansnum)
     58        return;
     59    vector<node> Q;
     60    Q.push_back(node(x,y,0));
     61    vis[x][y] = 1; 
     62    int l = 0; 
     63    int r = 0;
     64    while(l <= r )
     65    {
     66      for(int i = 0 ;i <= 3;i ++)
     67      {
     68        int tx = Q[l].x + xadd[i] ;
     69        int ty = Q[l].y + yadd[i] ;
     70        if(mp[tx][ty] >= 1 && !vis[tx][ty])
     71        {
     72          vis[tx][ty] = 1;
     73          r ++ ;
     74          if(mp[tx][ty] == 2)
     75          {
     76             Q.push_back(node(tx,ty,1));
     77             ans ++ ; 
     78          }
     79          else Q.push_back(node(tx,ty,0));
     80        }
     81      }
     82      l ++ ; 
     83    }
     84    if(ans > mx)
     85        mx = ans; 
     86    for(int i = 0;i < C.size();i ++)
     87      {
     88          if(!C[i].is)
     89          {
     90             for(int s = 0 ;s <= 3;s ++)
     91             {
     92                int tx = C[i].x + xadd[s];
     93                int ty = C[i].y + yadd[s];
     94                int ttx = C[i].x - xadd[s];
     95                int tty = C[i].y - yadd[s];
     96                //printf("%d %d %d %d
    ",tx,ty,ttx,tty);
     97                if(mp[tx][ty] == 1 && vis[ttx][tty] == 1)
     98                {
     99                    mp[tx][ty] = -1;
    100                    mp[C[i].x][C[i].y] = 1;
    101                    C[i].is = 1; 
    102                    bfs(C[i].x,C[i].y,ans);
    103                    mp[tx][ty] = 1;
    104                    mp[C[i].x][C[i].y] = 0;
    105                    C[i].is = 0 ; 
    106                }
    107             }
    108          }
    109      }
    110   for(int i = r; i >= 0 ;i --)
    111   {
    112       vis[Q[i].x][Q[i].y] = 0  ;
    113       if(Q[i].is)
    114       {
    115          mp[Q[i].x][Q[i].y] = 2  ;
    116       }
    117   }
    118 }
    119 int main(){
    120     int t ; 
    121     scanf("%d",&t);
    122     while(t--)
    123     {
    124          memset(mp,-1,sizeof(mp));
    125          memset(vis,0,sizeof(vis));
    126          scanf("%d %d",&n,&m);
    127          char str[20];
    128          int bex, bey ;
    129          ansnum =0 ; 
    130          C.clear();
    131          for(int i = 1 ;i <= n;i ++)
    132          {
    133              scanf("%s",&str[1]);
    134              for(int j = 1;j <= m; j ++)
    135              {
    136                if(str[j] == 'S')
    137                {
    138                  mp[i][j] = 1 ; 
    139                  bex = i ; 
    140                  bey = j ; 
    141                }else if(str[j] == 'C')
    142                {
    143                  ansnum ++;
    144                  mp[i][j] = 2; 
    145                }else if(str[j] == 'X')
    146                {
    147                  mp[i][j] = -1; 
    148                }else if (str[j] == 'O'){
    149                  mp[i][j] = 0 ;
    150                  C.push_back(node(i,j,0));
    151                }else {
    152                  mp[i][j] = 1; 
    153                }
    154              }
    155          }
    156          mx = 0 ; 
    157          bfs(bex,bey,0);
    158          printf("%d
    ",mx);
    159     }
    160     
    161     return 0;
    162 }
    View Code

    J:注意到点只有 1000 ,所以直接暴力DP就行  dp[i] 表示为到a[i]这个点最长的公共递增长度。

    每一次输入b[j],从头开始枚举,a[i] < b[j] 且 长度最长的值,到了 b[j] = a[i],更新dp[i] 即可

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 #include <map>
     9 #include <stack>
    10 #include <list>
    11 #include <vector>
    12 #include <ctime>
    13 #define LL __int64
    14 #define eps 1e-8
    15 using namespace std;
    16 int a[1004];
    17 int b[1004];
    18 int dp[1004];
    19 int main()
    20 {
    21   int numa,numb;
    22   int t; 
    23   scanf("%d",&t);
    24   while(t--)
    25   {
    26         scanf("%d",&numa);
    27         for(int i= 1;i<= numa;i ++)
    28            scanf("%d",&a[i]);
    29         
    30       scanf("%d",&numb);
    31       memset(dp,0,sizeof(dp));
    32         for(int i= 1;i<= numb;i ++)
    33            {
    34                  scanf("%d",&b[i]);
    35                  int mx = 0 ; 
    36                  for(int j = 1;j <= numa ;j ++)
    37                  {
    38                      if(b[i] > a[j])
    39                      {
    40                          mx = max(mx,dp[j]);
    41                      }else if(b[i] == a[j]){
    42                          dp[j] = mx+1;
    43                      }
    44                  }  
    45            }
    46         int mx = 0 ;
    47         for(int i= 1;i <= numa;i ++)
    48         {
    49                mx = max(dp[i],mx);
    50         }
    51         printf("%d
    ",mx);
    52   } 
    53   return 0 ; 
    54 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    linux 端口被占用
    vue项目刷新当前页面
    SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别
    mybatis模糊查询去除特殊符号%(百分号)和_(下划线)
    SpringMVC 五种注解参数绑定
    导出数据到Excel--多sheet
    POI 导出工具 实例
    Java 数组转换成字符串 添加逗号 类似 js array的join
    SpringBoot常用注解总结
    Java类的主动使用和被动使用-面试题
  • 原文地址:https://www.cnblogs.com/zyue/p/4009510.html
Copyright © 2011-2022 走看看