題目兩個數字,n位數,m進制,可以重新排序數字的順序,兩個數對應相加并對m取模而不進位,求最大和
例如輸入
5 5
4 4 1 1 1
4 3 0 1 2
5 5 代表兩個數都有5位(個 十 百 千 萬…),後面那個5代表5進制
4 4 1 1 1 代表第一個數,每位之間加空格隔開
4 3 0 1 2 代表第二個數,
連個數各位上的數都是正整數,且可以重新排列,問兩個數對應相加并對m取模而不進位的最大值
輸出結果為
4 4 3 3 2
過程
4 4 1 1 1 -------> 1 4 1 4 1
4 3 0 1 2 -------> 3 0 2 4 1
結果4 4 3 8 2,對5取模得到 4 4 3 3 2
思路
1、對兩個數組的數求餘
2、将其中一個數組的元素放到哈希表中 B,這樣查找會比暴力解法少一層循環
3、從num=m-1開始在哈希表B中找
與A[i]和為num的元素在哈希表B中是否存在,存在,就對和m求餘存在A[i]中,然後A[i]設定為已經處理了
注意這裡的num如果比A[i]大的話,要加上一個進制m
不知道過沒過,同學沒打完
代碼
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector<int> A(n,0);
vector<bool> sA(n,false);
unordered_map<int,int> B;
int value;
for(int i=0;i<n;i++)
{
cin>>A[i];
A[i]=A[i]%m;
}
for(int i=0;i<n;i++)
{
cin>>value;
value=value%m;
B[value]++;
}
int num=m;
while(m--) //從最大的數m-1開始找
{
if(!B.size()) //當哈希表中沒有元素了,說明已經找完了
break;
for(int i=0;i<n;i++)
{
if(sA[i])
continue; //對已經比對好的A中的元素,不需要在比對了
int temp=m;
if(m<A[i]) //如果m的值小于A[i],那麼m-A[i]就是負數,肯定不行
temp=m+num;
if(B[temp-A[i]]>=1) //與A[i]和為num的元素在哈希表B中是否存在,存在,就對和m求餘存在A[i]中,然後A[i]設定為已經處理了
{
B[temp-A[i]]--;
A[i]=temp%num;
sA[i]=true;
}
}
}
sort(A.begin(),A.end(),[](int a,int b){return a>b;});
for(auto c:A)
cout<<c<<' ';
}