任务
有M个仓库(M <= 100000),里面有一定重量的货物。首先,我们有M行输入,每行看起来像这样:
t a1 a2 a3 a4.
其中t为仓库内已排列的物品数量,a1 a2 a3 a4.为重量(t <= 1000000000000000,重量<= 214747483647)
然后,我们得到两种类型的Q查询(Q <= 200000):
K-打印出每个仓库内所有货物的总重量
Rmz md tp tk -将索引在tp和tk之间(含)的所有器皿从索引号为mz的仓库移动到索引为md的仓库的端。
mz,md <= 100000
-255 <= tp,tk <= 255
索引从1开始(索引1 -第一个项目,索引2 -第二个项目,等等)。负索引-n意味着我想要一个索引为n的项目从末尾开始计数(因此-1将是仓库中的最后一个项目)。
基本上,如果我有两个仓库的项目(他们的重量)安排这样,
**1.**2 3 4
**2.**5 12 1
然后我输入:
R 2 1 1 -1
K
我将把所有物品从仓库2移到仓库1的末尾(保持它们的顺序),这样看起来就像这样:
**1.**2 3 4 5 12 1
2.
然后像这样打印出两者的和:
27 0
示例
AInput:
1 1
1 1
K
输出量:
1
B输入:
3 5
2 1 1
0
4 1 2 3 4
K
R 3 2 1 - 1
K
R 2 1 1 1
K
输出量:
2 0 10
2 10 0
3 9 0
CInput:
2 6
3 2 2 2
2 3 3
K
R 1 2 2 - 2
K
R 1 2 1 - 1
R 2 1 1 -1
K
输出量:
6 6
4 8
12 0
我的密码
我已经写了一些基本的基础,我希望完成的程序看起来像:
#include <stdio.h>
int main() {
long int M,Q,t,ware;
if (scanf("%ld %ld",&M,&Q) != 2)
{
printf("Invalid Input");
}
char check;
//declaration of warehouse size - subject to change
long int warehouses[M+1][1000];
//array with sums of weights of items in each warehouse
long long int sumy[M+1];
//array with sizes of each warehouse
long int length[M+1];
for (int i = 1; i<M+1;i++)
{
if (scanf(" %ld",&t) != 1)
{
printf("Invalid Input");
}
length[i] = t;
for (int j = 1; j<t+1;j++)
{
if (scanf(" %ld",&ware) != 1)
{
printf("Invalid Input");
}
warehouses[i][j] = ware;
sumy[i] += ware;
}
}
long int mz,md;
int tp,tk;
for (int k = 0;k<Q;k++)
{
if (scanf(" %c",&check) != 1)
{
printf("Invalid Input");
}
if (check == 'K')
{
for (int ki = 0; ki < M;ki++)
{
printf("%lld",sumy[ki+1]);
printf(" ");
}
printf("\n");
}else
{
//indexes of "from warehouse" and "to warehouse"
if (scanf(" %ld %ld",&mz,&md) != 2)
{
printf("Invalid Input");
}
//indexes of the range of items we want to transport
if (scanf(" %d %d",&tp,&tk) != 2)
{
printf("Invalid Input");
}
if (tp < 0)
{
tp = length[mz] + tp + 1;
}
if (tk < 0)
{
tk = length[mz] + tk + 1;
}
for (int kj = 0; kj <= tk - tp ;kj++)
{
//moving items - subject to change
warehouses[md][length[md]+1] = warehouses[mz][tp + kj];
sumy[mz] -= warehouses[mz][tp + kj];
sumy[md] += warehouses[mz][tp + kj];
warehouses[mz][tp + kj] = 0;
length[md] += 1;
length[mz] -= 1;
}
}
}
return 0;
}
字符串
一个明显的问题是像这样声明2D数组long int warehouses[M+1][1000];
(低效的内存管理+我不能让它像它应该的那样大,因为它需要太多的内存)而不是动态地做,但这正是我做这个线程的原因。我对C编程有点陌生,使用内存分配和指针对我来说仍然很困难。理想情况下,我希望这段代码有一个“动态2D数组”(使用指针数组,但也许有人有更好的主意),然后根据货物的运输重新分配大小。如果有人可以重写这些部分,并帮助我了解他们是如何工作的,我会非常感激。建议也欢迎。
1条答案
按热度按时间kq4fsx7k1#
使用链接列表调整:
字符串