OR171. 最佳配对
描述
给定两个长度为N的整型数组A和B。如果Ai==Bj则认为(i,j)为最佳配对。所有的最佳配对在满足以下条件的情况下组成最佳配对集合:A和B中的各个元素最多在集合中出现一次。例如,A =「5, 10, 11,12, 14」,B = 「8, 9 ,11, 11, 5」,配对集合为「(0,4),(2,2),(2,3)」,因为在集合A中索引2出现了两次,所以上面的配对集合不是最佳配对集合。你的任务是修改B中的一个元素,使得最佳配对集合的元素最多。并输出最佳配对集合的数量。输入描述
输入第一行为一个数字N,表示数组A和B的长度。输入第2行和3行都是N个数字,分别表示数组A和B的元素输出描述
修改B中的一个元素,并打印最大的最佳配对集合数量。注意:必须修改B中的一个元素。示例1
输入:
4 1 2 3 4 1 2 3 3
输出:
4
C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-08-02
#include <stdio.h> int main() { int N; scanf("%d", &N); int a[N],b[N]; int i,j,k=0,s=0,tem[N],f=0,fl=0,fla=0; for(i=0;i<N;i++) { scanf("%d",&a[i]); } for(i=0;i<N;i++) { scanf("%d",&b[i]); } for(i=0;i<N;i++) { f=0; tem[i]=0; for(j=0;j<N;j++) { if((a[i]==b[j])&&(tem[i]==0)) { tem[i]=1; s++; //printf("^^^%d x:%d y:%d flag=%d\n",s,i,j,tem[i]); f=1; } else if((a[i]==b[j])&&(tem[i]==1)) { k++; //printf("---%d--",k); } } //printf("###%d###\n",f); if(f==0) fla++; if(fla&&k) { s++; //printf("**%d\n",s); k-=1; fl=1; fla--; } } printf("%d\n",fl==1?s:--s); return 0; }
C++ 解法, 执行用时: 2ms, 内存消耗: 316KB, 提交时间: 2021-09-19
#include <bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n; int a[n],b[n]; for(m = 0;m < n;++m) { cin>>a[m]; } for(m = 0;m < n;++m) { cin>>b[m]; } int cnt=0; for(int i=0;i<n;++i) { for(int j=0;j<n;j++) { if(a[i] == b[j]) { cnt++; b[j] = 0; break; } } } cout << (cnt==n?(cnt-1):(cnt+1)); }