zoukankan      html  css  js  c++  java
  • 11th Iran Nationwide Internet Contest 解题报告

    ---恢复内容开始---

    题目链接:http://acm.hnu.cn/online/?action=problem&type=list&courseid=283

    A:模拟3n+1问题

    解题思路:数比较小,直接模拟爆

    解题代码:

     1 #include<vector>
     2 #include<list>
     3 #include<map>
     4 #include<set>
     5 #include<deque>
     6 #include<stack>
     7 #include<bitset>
     8 #include<algorithm>
     9 #include<functional>
    10 #include<numeric>
    11 #include<utility>
    12 #include<sstream>
    13 #include<iostream>
    14 #include<iomanip>
    15 #include<cstdio>
    16 #include<cmath>
    17 #include<cstdlib>
    18 #include<cstring>
    19 #include<ctime>
    20 #define LL long long
    21 
    22 using namespace std;
    23 char str[1000];
    24 int a[600];
    25 int dp[505][505];
    26 int main(){
    27   int n ; 
    28   while(scanf("%d",&n) != EOF,n)
    29   {
    30     scanf("%s",str);
    31      //n = strlen(str);
    32     for(int i = 1;i <= n;i ++)
    33     {
    34       if(str[i-1] == 'A')
    35       {
    36          a[i] = 1;
    37       }else if(str[i-1] == 'U'){
    38          a[i] = -1;
    39       }else if(str[i-1] == 'G'){
    40          a[i] = 2;
    41       }else if(str[i-1] == 'C'){
    42          a[i] = -2;
    43       }
    44     }
    45     memset(dp,0,sizeof(dp));
    46     for(int i = 3;i <= n;i ++ )
    47     {
    48       for(int j = i-2;j >= 1;j -- )
    49       { 
    50          int t = 0 ;
    51          for(int s = j+1; s <= i ;s ++ )
    52            if(dp[i][s] + dp[s-1][j] > t )
    53                  t = dp[i][s] + dp[s-1][j];
    54          dp[i][j] = t ;
    55          if(a[i] + a[j] == 0 )
    56          {
    57             dp[i][j] = max(dp[i][j],dp[i-1][j+1] + 1);
    58          }
    59       }
    60     }
    61     printf("%d
    ",dp[n][1]);
    62     //printf("%d
    ",dp[13][1]);
    63   }
    64 return 0;
    65 }
    View Code

    B:给你两个文件名,让你比较大小,这里数字和字母是分开比较的,有前导0而且还有大数,所以判断有点繁琐。

    解题思路:模拟,暴力

    解题代码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<ctype.h>
      4 char temp11[] = "###";
      5 char str[257] ; 
      6 char str1[257];
      7 int ok = 0 ; 
      8 void solve(int fuck)
      9 {
     10   int t = 0 ; 
     11   int t1 = 0 ;
     12   int len  = strlen(str);
     13   int len1 = strlen(str1);
     14   while(t < len && t1 < len1)
     15   {
     16        if(isalpha(str[t]) && isalpha(str1[t1]))
     17        {
     18           if(str[t] == str1[t1]) 
     19           {
     20             t ++ ; 
     21             t1 ++ ; 
     22             continue;
     23           }else if(isupper(str[t]) && islower(str1[t1]))
     24           {
     25              if(str[t] - 'A' < str1[t1] -'a')
     26              {
     27                puts("<");
     28                return;
     29              }
     30              else if(str[t] - 'A' > str1[t1] -'a')
     31              {
     32                puts(">");
     33                return;
     34              }else if(fuck)
     35              {
     36                 puts(">");
     37                 return;
     38              }
     39              t ++ ; 
     40              t1 ++ ;
     41           }else if(isupper(str1[t1]) && islower(str[t]))
     42           {
     43             if(str1[t1] - 'A' < str[t] -'a')
     44             {
     45               puts(">");
     46               return;
     47             }else if(str1[t1] - 'A' > str[t] -'a')
     48             {
     49               puts("<");
     50               return;
     51             }else if(fuck)
     52             {
     53               puts("<");
     54               return;
     55             }
     56             t ++ ; 
     57             t1 ++;
     58           }else{
     59             if(str1[t1] - 'a' > str[t] - 'a')
     60             {
     61               puts("<");
     62               return;
     63             }else{
     64               puts(">");
     65               return;
     66             }
     67           }
     68        }else if(isdigit(str[t]) && !isdigit(str1[t1])) 
     69        {
     70           puts("<");
     71           return;
     72        }else if(isdigit(str1[t1]) && !isdigit(str[t])){
     73           puts(">");
     74           return;
     75        }else{
     76          char temp[257];
     77          char temp1[257];
     78          memset(temp,0,sizeof(temp));
     79          memset(temp1,0,sizeof(temp));
     80            int p = -1;
     81            int flag ;
     82            if(fuck)
     83                flag = 1;
     84            else flag = 0 ;
     85            while(isdigit(str[t])) 
     86            {
     87              if(flag == 0 )
     88              {
     89                if(str[t] != '0')
     90                {
     91                  flag = 1; 
     92                  p ++ ; 
     93                  temp[p] = str[t]; 
     94                }
     95              }else{
     96                  p ++ ;
     97                  temp[p] = str[t]; 
     98              }
     99              t ++ ;
    100            }
    101            p = -1;
    102            if(fuck)
    103                flag = 1; 
    104            else flag = 0 ;
    105            while(isdigit(str1[t1])) 
    106            {
    107              if(flag == 0 )
    108              {
    109                if(str1[t1] != '0')
    110                {
    111                  flag = 1; 
    112                  p ++ ; 
    113                  temp1[p] = str1[t1]; 
    114                }
    115              }else{
    116                  p ++ ;
    117                  temp1[p] = str1[t1]; 
    118              }
    119              t1 ++ ;
    120            }
    121           if(!fuck)
    122           {
    123            int len = strlen(temp);
    124            int len1 = strlen(temp1);
    125            if(len1 > len)
    126            {
    127              puts("<");
    128              return ;
    129            }else if(len > len1){
    130              puts(">");
    131              return ;
    132            }else{
    133              int k = strcmp(temp,temp1);
    134              if(k < 0)
    135              {
    136               puts("<");
    137               return; 
    138              }else if(k > 0 ){
    139               puts(">");
    140               return;
    141              }
    142            }
    143           }else{
    144              int k = strcmp(temp,temp1);
    145              if(k < 0)
    146              {
    147               puts("<");
    148               return; 
    149              }else if(k > 0 ){
    150               puts(">");
    151               return;
    152              }
    153           }
    154        }
    155   }
    156   if(t == len && t1 != len1)
    157       puts("<");
    158   else if(t1 == len1 && t != len)
    159       puts(">");
    160   else{
    161      ok = 1; 
    162   }
    163 }
    164 int main(){
    165   while(scanf("%s",str) != EOF)
    166   {
    167      if(strcmp(str,temp11) == 0 )
    168          break;
    169      scanf("%s",str1);
    170      if(strcmp(str,str1) == 0 )
    171          puts("=");
    172      else {
    173        ok = 0 ; 
    174        solve(0);
    175        if(ok)
    176            solve(1);
    177      }
    178   }
    179 return 0;
    180 }
    View Code

    C:题意:给你一串只含有  A U G C  字符组成的字符串,A U 能够连线 ,G,C能够连线,相邻不能连线,且线不能交叉,问你最多能连多少根线,

    解题思路:显然这个题目是DP,dp[i][j] =max( dp[i][s] + dp[s-1][j] ,dp[i][j] ,如果ij能连线,还要加上  dp[i-1][j-1] + 1) ,比赛时因为max函数消耗太大而超时

    解题代码:

     1 #include<vector>
     2 #include<list>
     3 #include<map>
     4 #include<set>
     5 #include<deque>
     6 #include<stack>
     7 #include<bitset>
     8 #include<algorithm>
     9 #include<functional>
    10 #include<numeric>
    11 #include<utility>
    12 #include<sstream>
    13 #include<iostream>
    14 #include<iomanip>
    15 #include<cstdio>
    16 #include<cmath>
    17 #include<cstdlib>
    18 #include<cstring>
    19 #include<ctime>
    20 #define LL long long
    21 
    22 using namespace std;
    23 char str[1000];
    24 int a[600];
    25 int dp[505][505];
    26 int main(){
    27   int n ; 
    28   while(scanf("%d",&n) != EOF,n)
    29   {
    30     scanf("%s",str);
    31      //n = strlen(str);
    32     for(int i = 1;i <= n;i ++)
    33     {
    34       if(str[i-1] == 'A')
    35       {
    36          a[i] = 1;
    37       }else if(str[i-1] == 'U'){
    38          a[i] = -1;
    39       }else if(str[i-1] == 'G'){
    40          a[i] = 2;
    41       }else if(str[i-1] == 'C'){
    42          a[i] = -2;
    43       }
    44     }
    45     memset(dp,0,sizeof(dp));
    46     for(int i = 3;i <= n;i ++ )
    47     {
    48       for(int j = i-2;j >= 1;j -- )
    49       { 
    50          int t = 0 ;
    51          for(int s = j+1; s <= i ;s ++ )
    52            if(dp[i][s] + dp[s-1][j] > t )
    53                  t = dp[i][s] + dp[s-1][j];
    54          dp[i][j] = t ;
    55          if(a[i] + a[j] == 0 )
    56          {
    57             dp[i][j] = max(dp[i][j],dp[i-1][j+1] + 1);
    58          }
    59       }
    60     }
    61     printf("%d
    ",dp[n][1]);
    62     //printf("%d
    ",dp[13][1]);
    63   }
    64 return 0;
    65 }
    View Code

    E:一个长度为 2×n 的字符串,每次有这样的变换规律,i <= n  i = i *2 ; i >= n; i = (i-n)*2 +1

    解题思路:可知有个2×n的循环节

    解题代码:

     1 // File Name: d.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年09月12日 星期五 09时33分05秒
     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 str[300];
    28 char temp[300];
    29 char str1[300];
    30 int main(){
    31    int n ;
    32    while(scanf("%d",&n) != EOF,n)
    33    {
    34     memset(str,0,sizeof(str));
    35     memset(str1,0,sizeof(str1));
    36     memset(temp,0,sizeof(temp));
    37     scanf("%s",str);
    38     scanf("%s",&str[n]);
    39     scanf("%s",str1);
    40     int ok = 0 ;
    41     for(int i = 1;i <= 2*n;i ++)
    42     {
    43        int b1 = 0 ;
    44        int b2 = n;
    45        int t = -1;
    46        for(int j = 1;j <= n;j ++)
    47        {
    48           t ++ ;
    49           temp[t] = str[b2];
    50           b2 ++ ;
    51           t ++;
    52           temp[t] = str[b1];
    53           b1 ++ ; 
    54        }
    55        //puts(temp);
    56        if(strcmp(temp,str1) == 0 )
    57        {
    58          ok  = 1 ; 
    59          printf("%d
    ",i);
    60          break;
    61        }
    62        strcpy(str,temp);
    63     }
    64     if(!ok)
    65        printf("-1
    ");
    66    }
    67 return 0;
    68 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/zyue/p/3969527.html
Copyright © 2011-2022 走看看