博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
11th Iran Nationwide Internet Contest 解题报告
阅读量:4326 次
发布时间:2019-06-06

本文共 8574 字,大约阅读时间需要 28 分钟。

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

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

A:模拟3n+1问题

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

解题代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #include
20 #define LL long long21 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\n",dp[n][1]);62 //printf("%d\n",dp[13][1]);63 }64 return 0;65 }
View Code

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

解题思路:模拟,暴力

解题代码:

1 #include
2 #include
3 #include
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
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #include
20 #define LL long long21 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\n",dp[n][1]);62 //printf("%d\n",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
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #include
20 #include
21 #include
22 #include
23 #include
24 #define LL long long25 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\n",i);60 break;61 }62 strcpy(str,temp);63 }64 if(!ok)65 printf("-1\n");66 }67 return 0;68 }
View Code

 

转载于:https://www.cnblogs.com/zyue/p/3969527.html

你可能感兴趣的文章
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
07 js自定义函数
查看>>
jQueru中数据交换格式XML和JSON对比
查看>>
form表单序列化后的数据转json对象
查看>>
[PYTHON]一个简单的单元測试框架
查看>>
iOS开发网络篇—XML数据的解析
查看>>
[BZOJ4303]数列
查看>>
一般处理程序在VS2012中打开问题
查看>>
C语言中的++和--
查看>>
thinkphp3.2.3入口文件详解
查看>>
POJ 1141 Brackets Sequence
查看>>