你们镇上的一些居民已经制作了给彼此的圣诞礼物。但今天镇长宣布,他镇上的每个居民,必须制作和他收到的礼物一样多的礼物。现在他们需要你的编程技巧来计算出基于他们已经制作出的礼物数量,还缺少多少礼物来满足市长的要求。
输入:
一行包含N和M(2≤N≤10^5,1 ≤M≤ 3*10^5)--人的数量和他们已经制作的礼物的数量
M行描述礼物,第i行包含整数xi和yi (1 ≤ xi , yi ≤ N), 代表着xi已经给yi做了礼物
输出:
缺失的礼物的数量。一个人可以收到来自同一个人的多份礼物。
#include<iostream>
#include<math.h>
#define MAX_N 100000
#define MAX_M 300000
using namespace std;
int inDegree[MAX_N] = { 0 }, outDegree[MAX_N] = { 0 };
int main() {
int n, m,i,x,y,num=0;
cin >> n >> m;
for (i = 0; i < n; i++)
inDegree[i] = outDegree[i] = 0;
for (i = 0; i < m; i++) {
cin >> x >> y;
inDegree[y - 1] += 1;
outDegree[x - 1] += 1;
}
for (i = 0; i < n; i++) {
num += abs(inDegree[i] - outDegree[i]);
}
cout << num/2 << endl;
}
没明白你的问题是什么?
是直接要帮忙写代码?
#define Max_N 100000
#define Max_M 300000
#include<stdio.h>
int Unique(int gifts[Max_N][2], int k)
{
int i = k;
for (i = k-1; i >= 0; i--)
{
if (gifts[k][0] == gifts[i][0])
return 0;
}
return 1;
}
int main()
{
int N = 0;
int M = 0;
int gifts[Max_N][2] = { 0 };
again:
scanf("%d%d", &N, &M);
if ((N<2 && N>Max_N) || (M<1 && M>Max_M))
goto again;
int i = 0;
for (i = 0; i < M; i++)
{
int j = 0;
for (j = 0; j < 2; j++)
{
scanf("%d", &gifts[i][j]);
}
}
//Missing gifts_count
int k = 0;
int sum = 0;
int max_sum = 0;
do
{
int count1 = 1;
int count2 = 0;
int ret = 1;
if (k > 0)
{
ret = Unique(gifts, k);
}
if (ret)
{
for (i = k; i +1< M; i++)
{
if (gifts[k][0] == gifts[i + 1][0])
{
count1++;
}
}
for (i = 0; i < M; i++)
{
if (gifts[k][0] == gifts[i][1])
{
count2++;
}
}
if (i >= M)
k++;
}
else
{
k++;
}
sum = count2 - count1;
if (max_sum < sum)
max_sum = sum;
}while (M - k );
printf("%d\n", max_sum);
return 0;
}
希望对有用
#define Max_N 100000
#define Max_M 300000
#include<stdio.h>
int Unique(int gifts[Max_N][2], int k)
{
int i = k;
for (i = k-1; i >= 0; i--)
{
if (gifts[k][0] == gifts[i][0])
return 0;
}
return 1;
}
int main()
{
int N = 0;
int M = 0;
int gifts[Max_N][2] = { 0 };
again:
scanf("%d%d", &N, &M);
if ((N<2 && N>Max_N) || (M<1 && M>Max_M))
goto again;
int i = 0;
for (i = 0; i < M; i++)
{
int j = 0;
for (j = 0; j < 2; j++)
{
scanf("%d", &gifts[i][j]);
}
}
//Missing gifts_count
int k = 0;
int sum = 0;
//int max_sum = 0;
do
{
int count1 = 1;
int count2 = 0;
int ret = 1;
if (k > 0)
{
ret = Unique(gifts, k);
}
if (ret)
{
for (i = k; i +1< M; i++)
{
if (gifts[k][0] == gifts[i + 1][0])
{
count1++;
}
}
for (i = 0; i < M; i++)
{
if (gifts[k][0] == gifts[i][1])
{
count2++;
}
}
if (i >= M)
k++;
if(count1>count2)
sum = sum+count1 - count2;
}
else
{
k++;
}
/*sum = count2 - count1;*/
/*if (max_sum < sum)
max_sum = sum;*/
}while (M - k );
printf("%d\n", sum);
return 0;
}
再试试,还是不行给我几组数据我调试
#define Max_N 100000
#define Max_M 300000
#include<stdio.h>
int Eliminate_common(int gifts[Max_N][2],int m,int j)
{
int i = 0; int k = 0;
for (i = 0;i<m;i++)
{
if (gifts[j][0] == gifts[i][1])
{
k++;
gifts[j][0] = 0; gifts[i][1] = 0;
break;
}
}
if (k == 1)
return 0;
else return 1;
}
int main()
{
int N = 0;
int M = 0;
int gifts[Max_N][2] = { 0 };
again:
scanf("%d%d", &N, &M);
if ((N<2 && N>Max_N) || (M<1 && M>Max_M))
goto again;
int i = 0;
for (i = 0; i < M; i++)
{
int j = 0;
for (j = 0; j < 2; j++)
{
scanf("%d", &gifts[i][j]);
}
}
//Missing gifts_count
int ret = 0; int sum = 0;
for (i = 0; i < M; i++)
{
ret = Eliminate_common(gifts, M,i);
if (ret)
sum++;
}
printf("%d\n", sum);
return 0;
}