问题描述
- 问一道题目,c/c++的。
-
类模板
查看 提交 统计 提问
总时间限制: 2000ms 内存限制: 65535kB
描述
给长度为n的序列(n<=1000),这里有三种不同类型的序列,全是整数,全是浮点数,全是字符串,现在序列进行m次操作(m<=2000)。每次有两种操作:
移动:将区间[i, j]之间元素移动到k的后面。比如,对于序列1 2 3 4 5,将区间[0, 2]之间的元素移动到下标3的后面,序列将变为4 1 2 3 5。
反转:将区间[i, j ]之间的元素反转。比如:对于序列1 2 3 4 5,反转区间[1, 3],变为1 4 3 2 5。
注意:下标从0开始。
输入
第一行输入一个整数t,表示测试数据的组数。
对于每组测试数据,第一行输入有三列type, n , m,分别表示数据类型(interger, double, string),共n个数,m次操作。
每次操作首先输入一个字符oprator。
当oprator=”m”,移动操作,接着输入三个整数i,j,k,保证i小于等于j,k不在区间[i,j]内。
当oprator=”r”,反转操作,接着输入两个整数i,j,保证i小于等于j。
输出
对于每组测试数据,输出序列中的经过m次操作后的的n个元素,元素之间用空格隔开,注意最后一个元素后面不要输出空格,对于浮点数,保留2位小数。
样例输入
3
interger 5 5
626 323 537 538 118
r 1 3
m 1 3 4
r 0 2
m 0 3 4
r 1 3
double 5 5
1.96 2.22 1.29 1.61 5.35
r 1 2
r 1 2
m 1 2 3
r 0 3
m 0 3 4
string 5 5
qghumeay nlfdxf rcv cxggb kfnqdux
r 1 3
m 0 3 4
m 0 3 4
m 0 3 4
m 1 2 3
样例输出
323 626 118 538 537
5.35 1.29 2.22 1.61 1.96
rcv qghumeay nlfdxf kfnqdux cxggb
——————————————————————
我写出来string类型的不知道怎么带入到模板函数里面
integer和double都是可以得。
代码如下
——————————————————————
#include”stdio.h“
#include“iostream”
#include”string“
#include“cstdio”
using namespace std;
template
void f1(T a[], int i, int j, int k)
{
int t, p = 0;
T s[1000];
for (t = i; t <= j; t++)
s[p++] = a[t];
for (t = j + 1; t <= k; t++)
a[t - (j - i + 1)] = a[t];
for (t = k - (j - i + 1) + 1, p = 0; t <= k; t++, p++)
a[t] = s[p];
}
template
void f2(T a[], int i, int j)
{
int t1 = i, t2 = j;
T temp;
while (t1 != t2&&t1
{
temp = a[t1];
a[t1] = a[t2];
a[t2] = temp;
t1++;
t2--;
}
}
template
void f3(T &a, int i, int j)
{
int t1 = i, t2 = j;
char temp;
while (t1 != t2&&t1
{
temp = a[t1];
a[t1] = a[t2];
a[t2] = temp;
t1++;
t2--;
}
}
template
void f4(T &a, int i, int j, int k)
{
int t, p = 0;
char s[1000];
for (t = i; t <= j; t++)
s[p++] = a[t];
for (t = j + 1; t <= k; t++)
a[t - (j - i + 1)] = a[t];
for (t = k - (j - i + 1) + 1, p = 0; t <= k; t++, p++)
a[t] = s[p];
}
int main()
{
int a[1000], i, t, n, m, z1=0, z2=0, z3=0;
double b[1000];
char str2[10];
string ss;
char str1[10];
scanf_s("%d", &t);
while (t--)
{
cin >> str1;
scanf_s("%d%d", &n, &m);
if (strcmp(str1, "integer") == 0)
{
for (i = 0; i
scanf_s("%d", &a[i]);
while (m--)
{
cin >> str2;
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", &z1, &z2);
f2(a, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", &z1, &z2, &z3);
f1(a, z1, z2, z3);
}
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
}
else if (strcmp(str1, "double") == 0)
{
for (i = 0; i
scanf_s("%lf", &b[i]);
while (m--)
{
cin >> str2;
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", &z1, &z2);
f2(b, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", &z1, &z2, &z3);
f1(b, z1, z2, z3);
}
}
for (i = 0; i < n; i++)
printf("%0.2lf ", b[i]);
}
--------------------这里开始错误了------------
else{
cin >> ss;
while (m--)
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", z1, z2);
f3(ss, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", z1, z2, z3);
f4(ss, z1, z2, z3);
}
}
}
return 0;
}
解决方案
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
template<typename T>
void f1(T a[], int i, int j, int k)
{
int t, p = 0;
T s[1000];
for (t = i; t <= j; t++)
s[p++] = a[t];
for (t = j + 1; t <= k; t++)
a[t - (j - i + 1)] = a[t];
for (t = k - (j - i + 1) + 1, p = 0; t <= k; t++, p++)
a[t] = s[p];
}
template<typename T>
void f2(T a[], int i, int j)
{
int t1 = i, t2 = j;
T temp;
while (t1 != t2&&t1<t2)
{
temp = a[t1];
a[t1] = a[t2];
a[t2] = temp;
t1++;
t2--;
}
}
template<typename T>
void f3(T &a, int i, int j)
{
int t1 = i, t2 = j;
char temp;
while (t1 != t2&&t1<t2)
{
temp = a[t1];
a[t1] = a[t2];
a[t2] = temp;
t1++;
t2--;
}
}
template<typename T>
void f4(T &a, int i, int j, int k)
{
int t, p = 0;
char s[1000];
for (t = i; t <= j; t++)
s[p++] = a[t];
for (t = j + 1; t <= k; t++)
a[t - (j - i + 1)] = a[t];
for (t = k - (j - i + 1) + 1, p = 0; t <= k; t++, p++)
a[t] = s[p];
}
int main()
{
int a[1000], i, t, n, m, z1=0, z2=0, z3=0;
double b[1000];
char str2[10];
string ss;
char str1[10];
scanf_s("%d", &t);
while (t--)
{
cin >> str1;
scanf_s("%d%d", &n, &m);
if (strcmp(str1, "integer") == 0)
{
for (i = 0; i<n; i++)
scanf_s("%d", &a[i]);
while (m--)
{
cin >> str2;
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", &z1, &z2);
f2(a, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", &z1, &z2, &z3);
f1(a, z1, z2, z3);
}
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
}
else if (strcmp(str1, "double") == 0)
{
for (i = 0; i<n; i++)
scanf_s("%lf", &b[i]);
while (m--)
{
cin >> str2;
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", &z1, &z2);
f2(b, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", &z1, &z2, &z3);
f1(b, z1, z2, z3);
}
}
for (i = 0; i < n; i++)
printf("%0.2lf ", b[i]);
}
else{
cin >> ss;
while (m--)
if (strcmp(str2, "r") == 0)
{
scanf_s("%d%d", z1, z2);
f3(ss, z1, z2);
}
if (strcmp(str2, "m") == 0)
{
scanf_s("%d%d%d", z1, z2, z3);
f4(ss, z1, z2, z3);
}
}
}
return 0;
}
全角半角错了,另外oj不一定认scan_f
解决方案二:
一道C语言题目