zoukankan      html  css  js  c++  java
  • Codeforces Round #286 (Div. 2)

    A题:

    给出一个长度为n的字符串,操作:在这个字符串的任意位置(前后也可以)插入一个字符,使之成为一个回文串,

    而且,即使这个字符串本身就是回文串,你也必须插入一个字符。

    若无法达成目的,输出"NA"

    由于题意n<=10,所以直接暴力。

    1.看本身是否是回文串

    2.若本身不是,则暴力:

     从前到后每次去掉这个字符串的一个字符,看新形成的字符串是否为回文串,若是则在这个去掉的字符的相应位置插入这个字符,还是回文串,达成目的。

    若不是,则无法达成目的,输出“NA”

    我这段代码的问题:s下标从0开始,新形成的字符串下标从1开始,导致很紊乱。本来想改的,好困啊,睡觉了。

     1 #include<cstdio>
     2 #include<cstring>
     3 char s[11];
     4 int main()
     5 {
     6     while(scanf("%s",&s)!=EOF){
     7         int len=strlen(s);
     8         bool cnt=true;
     9         for(int i=1;i<=len/2;i++)
    10             if(s[i-1]!=s[len-i]){
    11                 cnt=false;
    12                 break;
    13             }
    14         if(cnt){
    15             for(int i=1;i<=len/2;i++)
    16                 printf("%c",s[i-1]);
    17             printf("%c",s[len/2]);
    18             for(int i=len/2+1;i<=len;i++)
    19                 printf("%c",s[i-1]);
    20             printf("
    ");
    21             continue;
    22         }
    23         for(int i=1;i<=len;i++){
    24             char t[11];
    25             int j=0,k=1;
    26             while(j<len){
    27                 if(j==i-1)
    28                     j++;
    29                 else{
    30                     t[k++]=s[j];
    31                     j++;
    32                 }
    33             }
    34             bool flag=true;
    35             for(int l=1;l<k;l++){
    36                 if(t[l]!=t[k-l]){
    37                     flag=false;
    38                     break;
    39                 }
    40             }
    41             if(flag){
    42                 i--;
    43                 if(i<=len/2){
    44                     for(int l=0;l<len-i;l++)
    45                         printf("%c",s[l]);
    46                     printf("%c",s[i]);
    47                     for(int l=len-i;l<len;l++)
    48                         printf("%c",s[l]);
    49                     printf("
    ");
    50                     goto loop;
    51                 }
    52                 else{
    53                     for(int l=0;l<len-i-1;l++)
    54                         printf("%c",s[l]);
    55                     printf("%c",s[i]);
    56                     for(int l=len-i-1;l<len;l++)
    57                         printf("%c",s[l]);
    58                     printf("
    ");
    59                     goto loop;
    60                 }
    61             }
    62         }
    63         printf("NA
    ");
    64         loop: ;
    65     }
    66     return 0;
    67 }
    A题
           B. Mr. Kitayuta's Colorful Graph
     
     

    Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The vertices of the graph are numbered from 1 ton. Each edge, namely edge i, has a color ci, connecting vertex ai and bi.

    Mr. Kitayuta wants you to process the following q queries.

    In the i-th query, he gives you two integers — ui and vi.

    Find the number of the colors that satisfy the following condition: the edges of that color connect vertex ui and vertex vi directly or indirectly.

    Input

    The first line of the input contains space-separated two integers — n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100), denoting the number of the vertices and the number of the edges, respectively.

    The next m lines contain space-separated three integers — aibi (1 ≤ ai < bi ≤ n) and ci (1 ≤ ci ≤ m). Note that there can be multiple edges between two vertices. However, there are no multiple edges of the same color between two vertices, that is, if i ≠ j(ai, bi, ci) ≠ (aj, bj, cj).

    The next line contains a integer — q (1 ≤ q ≤ 100), denoting the number of the queries.

    Then follows q lines, containing space-separated two integers — ui and vi (1 ≤ ui, vi ≤ n). It is guaranteed that ui ≠ vi.

    Output

    For each query, print the answer in a separate line.

    Sample test(s)
    input
    4 5
    1 2 1
    1 2 2
    2 3 1
    2 3 3
    2 4 3
    3
    1 2
    3 4
    1 4
    output
    2
    1
    0
    input
    5 7
    1 5 1
    2 5 1
    3 5 1
    4 5 1
    1 2 2
    2 3 2
    3 4 2
    5
    1 5
    5 1
    2 5
    1 5
    1 4
    output
    1
    1
    1
    1
    2

     

     题意:有一个无向图,n个节点,m条边,其中第i条边的颜色为ci,
        2点之间,可能有多条边直接相连,但这些边的颜色不会重复。
        有q个询问,
        对每一个询问,给出点u,v,问有多少种颜色的边可以把u、v连接起来。
     
    思路:链式前向星+dfs
     
     
     1 #include<cstdio>
     2 #include<cstring>
     3 
     4 const int maxn=210;
     5 struct Edge
     6 {
     7     int to,c,next;
     8 }edge[maxn*2];       
     9 int head[maxn],tot;
    10 
    11 void head_init()
    12 {
    13     tot=0;
    14     memset(head,-1,sizeof(head));
    15 }
    16 void addedge(int u,int v,int c)
    17 {
    18     edge[tot].c=c;
    19     edge[tot].to=v;
    20     edge[tot].next=head[u];
    21     head[u]=tot++;
    22 }
    23 
    24 bool color[maxn],flag;
    25 bool vis[maxn];
    26 void dfs(int cur,int col,int point)
    27 {
    28     if(cur==point)
    29     {
    30         flag=true;
    31         return ;
    32     }
    33     if(flag)
    34         return ;
    35     vis[cur]=true;
    36     for(int i=head[cur];i!=-1;i=edge[i].next)
    37     {
    38         int c=edge[i].c;
    39         int v=edge[i].to;
    40         if(c!=col)
    41             continue;
    42         if(vis[v])
    43             continue;
    44         dfs(v,col,point);
    45         vis[v]=false;      //回溯
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     int n,m;
    52     while(scanf("%d%d",&n,&m)!=EOF)
    53     {
    54         head_init();               //初始化
    55         memset(color,false,sizeof(color));   
    56         memset(vis,false,sizeof(vis));
    57         int u,v,c;
    58         for(int i=1;i<=m;i++)
    59         {
    60             scanf("%d%d%d",&u,&v,&c);
    61             addedge(u,v,c);
    62             addedge(v,u,c);      //无向边
    63             color[c]=true;       //标记有这种颜色
    64         }
    65         int q;
    66         scanf("%d",&q);
    67         for(int i=1;i<=q;i++)
    68         {
    69             scanf("%d%d",&u,&v);
    70             int sum=0;
    71             for(int i=1;i<=m;i++)
    72                 if(color[i])          
    73                 {
    74                     flag=false;      //能不能到达的标记
    75                     dfs(u,i,v);
    76                     vis[u]=false;     //回溯
    77                     if(flag)
    78                         sum++;
    79                 }
    80             printf("%d
    ",sum);
    81         }
    82     }
    83     return 0;
    84 }
    15ms
     
     
     
     
  • 相关阅读:
    ASP.NET 高级编程基础第十一篇—WebForm和Page类成员
    ASP.NET 高级编程基础第十三篇—验证控件
    C#委托和事件详解第二篇
    C#委托事件详解第三篇
    点击一个Button,来看Duwamish7的总体层次
    ELMAHError Logging Modules And Handlers
    [实例研究Duwamish]SystemFramework和Common命名空间
    关于Blog的一些周边资源
    .NET框架程序设计Globally Deployment Assembly全局部署程序集
    合并2个DataSet
  • 原文地址:https://www.cnblogs.com/-maybe/p/4385781.html
Copyright © 2011-2022 走看看