NeQrhk 2015-07-31 13:41 采纳率: 30.6%
浏览 2258

问一道题目,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;
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2015-07-31 13:46
    关注
     #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

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考