问题:哇,你有两件事:
调用所有进程的调用顺序。 应该执行所有进程的理想顺序。 现在,让我们通过一个例子来证明这一点。假设有3个进程,进程的调用顺序为:3 - 2 - 1.理想顺序为:1 - 3 - 2,即进程号3仅在进程号1完成后执行;进程号2只会在执行进程号3后执行。
迭代#1: 由于理想顺序首先执行进程#1,所以改变了有序调用,即必须将第一个元素推送到最后一个位置。更改元素的位置需要1个单位时间。新的呼叫顺序是:2 - 1 - 3.步骤#1中的时间:1。
迭代#2:由于理想顺序首先执行进程#1,所以必须再次更改有序调用,即必须将第一个元素推送到最后一个位置。新的呼叫顺序是:1 - 3 - 2.步骤2中所用的时间:1。
迭代次数#3:由于调用顺序的第一个元素与理想顺序相同,因此将执行该过程。它会因此而突然出现。步骤3:1中所用的时间。
迭代次数#4:由于调用顺序的新第一个元素与理想顺序相同,因此将执行该过程。步骤4中所用的时间:1。
迭代次数#5:由于调用顺序的最后一个元素与理想顺序相同,因此将执行该过程。步骤#5中的时间:1。
总时间:5个单位。 S:执行一个过程需要1个单位时间。改变位置需要1个单位时间。
输入格式: 第一行是数字N,表示进程数。第二行包含进程的调用顺序。第三行包含过程的理想顺序。
输出格式: 打印整个进程队列的总执行时间。
约束:1&lt; = N <= 100
示例输入
3
3 2 1
1 3 2
示例输出
5
我遇到的第一个方法是声明一个变量,并在每次交换加2后将其增加一个,但是如果我们采用大小为3的数组,则只有两种可能性。因此我将这些打印出来,是的,这是一个在线评判的问题,没有语法错误,但在网站上它告诉说声明有一些问题,我不知道该做什么我是编程的新手并且有人可以建议一种适用于更大尺寸阵列的新方法。
#include <stdio.h>
swap(a,b);
long long int a,b;
int main(void) {
long long int n,i;
long long int a[3],b[3];
scanf("%d",&n);
for(i=0;i<=2;i++)
{
scanf("%d",a[i]);
}
for(i=0;i<=2;i++)
{
scanf("%d",&b[i]);
}
if(a[i]=b[i])
{
printf("2");
}
while(a[i]!=b[i])
{
swap(b[0],b[2]);
swap(b[0],b[1]);
{
if(a[i]=b[i])
printf("5");
}
}
return 0;
}
swap(a,b){
long long int temp;
a=temp;
b=a;
temp=b;
return swap(a,b);
}
答案 0 :(得分:2)
您的swap()
功能存在多个问题:
1:它在函数的最后一行调用自己return swap(a,b);
。这将导致无限递归和堆栈溢出。
2:您需要声明函数的返回类型。如果它需要两个long long
参数并且什么都不返回,那么它应该声明如下:
void swap(long long a, long long b);
3:如上所述,该功能无论如何都无效。如果要更改其值,则需要将指针传递给这些变量:
long long swap(long long *a, long long *b);
4:要传递指向此函数的指针,请在参数前加&
,如下所示:
swap(&b[0],&b[2]); /* NOT: swap(b[0],b[2]); */
5:swap()
函数中的操作顺序也是错误的。您开始无可挽回地丢失a
的值而不是存储它,以便可以将其分配给b
。试试这个:
void swap(long long *a, long long *b) {
long long temp;
temp = *a;
*a = *b;
*b = temp;
}
注意:请了解如何正确格式化代码。此外,始终在启用警告的情况下编译开发代码(例如,将-Wall -pedantic
添加到命令行)。如果不是所有这些问题,这样做会引起你的注意,而不必在这里问。