1036: 字符识别?
题目描述
你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:
.*. *** ***
.*. ..* ..*
.*. *** ***
.*. *.. ..*
.*. *** ***
输入
输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。输出
输出应包含一行,即识别出的各个字符。
样例输入 Copy
3 .*..***.***. .*....*...*. .*..***.***. .*..*.....*. .*..***.***.
样例输出 Copy
123
只需要看第四行的字符特点就可以了:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
int i, j;
char a[5][100];
cin >> n;
for (i = 0; i < 5; i++)
cin >> a[i];
int l = strlen(a[0]);
int m = 0;
for (i = 0; i < l; i++)
{
m++;
if (m == 1 && a[3][i] == '*')
cout << "2";
if (m== 2 && a[3][i] == '*')
cout << "1";
if (m == 3 && a[3][i] == '*')
cout << "3";
if (m == 4)
m= 0;
}
cout << endl;
return 0;
}
1407: 数的划分
题目描述
使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。
输入
多组输入,每一组是一个正整数n。
输出
输出划分数。
样例输入 Copy
3 4
样例输出 Copy
3 5
#include<algorithm>
#include<iostream>
using namespace std;
int fun(int n, int m)
{
if (m == 1 || n == 1)
{
return 1;
}
if (m >n)
{
return fun(n, n);
}
if (m == n)
{
return 1 + fun(n, m - 1);
}
if(m<n)
{
return fun(n-m,m) + fun(n, m - 1);//包括m和不包括m
}
}
int main()
{
int n;
while (cin >> n)
{
cout << fun(n, n) << endl;
}
}
2173: 外观数列
题目描述
给定一个正整数 n ,请设计一个递归算法输出外观数列的第 n 项,「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
输入
多组输入,每组输入一个非负整数(n<=30)
输出
输出结果,每个结果占一行
样例输入 Copy
1 2 3样例输出 Copy
1 11 21
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
string fun(int n) {
if (n == 1) {
return "1";
}
string ss = fun(n - 1);
string res = "";
int count = 1;
for (int i = 0; i < ss.length(); i++) {
if (ss[i] == ss[i + 1]) {
count++;
}
else {
res +=to_string(count)+ ss[i];
count = 1;
}
}
return res;
}
int main()
{
int n;
while (cin >> n)
cout << fun(n) << "\n";
}
1427: 线性搜索
题目描述
请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109,T的元素不重复。
输入
多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。
输出
用1行输出C。
样例输入 Copy
5 1 2 3 4 5 3 3 4 1样例输出 Copy
3
#include<algorithm>
#include<iostream>
using namespace std;
int a[10005];
int b[505];
int main()
{
int n, q;
int count = 0;
while (cin >> n)
{
count = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &q);
for (int i = 0; i < q; i++)
{
scanf("%d", &b[i]);
}
for (int i = 0; i < n; i++)
{
int flag = a[i];
for (int j = 0; j < q; j++)
{
if (b[j] == flag)
{
count++;
}
}
}
printf("%d\n", count);
}
}
1418: 二分搜索(递归)
题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2 4 0 1 3 4 2
样例输出 Copy
2 -1
#include<algorithm>
#include<iostream>
using namespace std;
int fun(int a[], int left, int right,int n)
{
if (left > right)
{
return -1;
}
int mid = (left + right) / 2;
if (a[mid] == n)
{
return mid+1;
}
else if (a[mid] > n)
{
return fun(a,left,mid-1,n);
}
else
{
return fun(a, mid + 1, right, n);
}
}
int main()
{
int m, n;
int a[1005];
while (cin >> m)
{
for (int i = 0; i < m; i++)
{
cin >> a[i];
}
cin >> n;
cout << fun(a, 0, m, n) << endl;
}
}
1418: 二分搜索(非递归)
#include<algorithm>
#include<iostream>
using namespace std;
int fun(int a[], int left, int right,int n)
{
while (left<=right)
{
int mid = (left + right) / 2;
if (a[mid] == n)
{
return mid+1;
}
else if (a[mid] > n)
{
right = mid-1;
}
else
{
left = mid+1;
}
return -1;
}
}
int main()
{
int m, n;
int a[1005];
while (cin >> m)
{
for (int i = 0; i < m; i++)
{
cin >> a[i];
}
cin >> n;
cout << fun(a, 0, m, n) << endl;
}
}
1424: 二分搜索升级版
题目描述
设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当待搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素的位置j;当待搜索元素x在数组中时,返回的i和j相同,均为x在数组中的位置
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入带查询的值x。
输出
输出小于x的最大元素的位置i和大于x的最小元素的位置j;当待搜索元素x在数组中时,返回的i和j相同,均为x在数组中的位置
样例输入 Copy
3 1 2 3 2 4 0 1 3 4 2
样例输出 Copy
2 2 2 3
#include<algorithm>
#include<iostream>
using namespace std;
int fun(int a[], int left, int right,int n)
{
if (left > right)
{
return -1;
}
int mid = (left + right) / 2;
if (a[mid] == n)
{
return mid+1;
}
else if (a[mid] > n)
{
return fun(a,left,mid-1,n);
}
else
{
return fun(a, mid + 1, right, n);
}
return -1;
}
int main()
{
int m, n;
int a[1005];
while (cin >> m)
{
for (int i = 0; i < m; i++)
{
cin >> a[i];
}
cin >> n;
int result = fun(a, 0, m, n);
if (result!= -1)
{
cout << result << " " << result << endl;
}
else
{
int f1, f2;
for (int i = 0; i < m; i++)
{
if (a[i] > n)
{
f2 = i+1;
f1 = f2 - 1;
break;
}
}
cout << f1 << " " << f2 << endl;
}
}
}
1430: Strange function
题目描述
Now, here is a function:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
输入
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
输出
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.
样例输入 Copy
2 100 200
样例输出 Copy
-74.4291 -178.8534
提示
凸函数和凹函数求极值可以用三分查找来实现。
#include<algorithm>
#include<iostream>
using namespace std;
double fun(double x, double y)
{
return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y * x;
}
int main()
{
int t; double y;
cin >> t;
while (t--)
{
cin >> y;
double l = 0, r = 100, mid, mmid;
mid = (l + r) / 2.0;
mmid = (mid + r) / 2.0;
while (fabs(mid - mmid) > 1e-8)
{
if (fun(mid, y) < fun(mmid, y))
{
r = mmid;
}
else
l = mid;
mid = (l + r) / 2.0;
mmid = (mid + r) / 2.0;
}
printf("%.4lf\n", fun(mid, y));
}
}