给出N个三位数字,您的任务是查找所有N个数字的位数,然后根据这些计算出的位数打印可能的对数。
从3位数字开始,
·提取最大位数并乘以11,然后
·提取最小数字乘以7然后
·将两个结果相加以获得位对。
注意:-位分数应为2位数字,如果以上结果为3位数字,则只需忽略最高有效位。
请考虑以下示例:
说,号码是286
最大数字为8,最小数字为2
因此,8 * 11 + 2 * 7 = 102因此忽略最高有效位,因此位得分= 02。
说,数字是123
最大数字为3,最小数字为1
所以,3 * 11 + 7 * 1 = 40,所以位得分是40。
成对的条件是
·两个位评分都应处于奇数位置或偶数位置,以便有资格组成一对。
·只有在最高有效数字相同的情况下才可以进行配对,对于给定的有效数字最多可以进行两对。
约束 N <= 500
输入格式 第一行包含一个整数N,表示数字的计数。
第二行包含N个由空格分隔的3位整数
输出 一个整数值,表示位对的数量。
测试用例
说明 示例1
输入
8 234 567 321 321 345 110110767 111
输出
3
说明
获得数字的最高有效位数和最低有效位数并应用规则1中给出的公式后,我们得出的数字的位得分为:
58 12 40 76 40 11 19 18
不。对中可能有3个:
40分别在奇数索引3和5出现两次。因此,这是一对。
12、11、18是偶数索引。因此,从这三位分数中可以得到两对。
因此可能的总对为3
#include <iostream>
#include <vector>
using namespace std;
vector<int> correctBitScores(vector<int>);
vector<int> bitScore(vector<int>);
int findPairs(vector<int>);
int main() {
int a, b;
int pairs = 0;
vector<int> vec;
vector<int> bitscore;
cout << "\nEnter count of nos: ";
cin >> a;
for (int i = 0; i < a; i++) {
cin >> b;
vec.push_back(b);
}
bitscore = bitScore(vec);
pairs = findPairs(bitscore);
cout << "Max pairs = " << pairs;
return 0;
}
vector<int> correctBitScores(vector<int> bis) {
int temp = 0;
for (size_t i = 0; i < bis.size(); i++) {
temp = bis[i];
int count = 0;
while (temp > 0) {
temp = temp / 10;
count++;
}
if (count > 2)
bis[i] = abs(100 - bis[i]);
}
/*cout << "\nCorrected" << endl;
for (int i = 0; i < size(bis); i++) {
cout << bis[i] << endl;
}*/
return bis;
}
int findPairs(vector<int> vec) {
int count = 0;
vector<int> odd;
vector<int> even;
for (size_t i = 0; i < vec.size(); i++)
(i % 2 == 0 ? even.push_back(vec[i]) : odd.push_back(vec[i]));
for (size_t j = 0; j < odd.size(); j++)
for (size_t k = j + 1; k < odd.size(); k++) {
if (odd[j] / 10 == odd[k] / 10) {
count++;
odd.erase(odd.begin()+j);
}
}
for (size_t j = 0; j < even.size(); j++)
for (size_t k = j + 1; k < even.size(); k++) {
if (even[j] / 10 == even[k] / 10) {
count++;
even.erase(even.begin() + j);
}
}
return count;
}
vector<int> bitScore(vector<int> v) {
int temp = 0, rem = 0;
vector<int> bs;
for (size_t i = 0; i < v.size(); i++) {
int max = 0, min = 9;
temp = v[i];
while (temp > 0) {
rem = temp % 10;
if (min > rem)
min = rem;
if (max < rem)
max = rem;
temp = temp / 10;
}
int bscore = (max * 11) + (min * 7);
bs.push_back(bscore);
}
/*cout << "\nBit Scores = " << endl;
for (int i = 0; i < size(bs); i++) {
cout << bs[i] << endl;
}*/
bs = correctBitScores(bs);
return bs;
}
答案 0 :(得分:-1)
根据对Que的理解,我尝试用非常简单的c ++代码编写代码,您能否再验证一下更多的测试用例。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,count=0;
cin>>n;
vector<int>v(n);
for(int i=0;i<n;i++){
cin>>v[i];
string s = to_string(v[i]);
sort(s.begin(),s.end());
int temp = (s[s.length()-1]-'0')*11 + (s[0] - '0')*7;
v[i] = temp%100;
}
unordered_map<int ,vector<int>>o,e;
for(int i=0;i<n;i=i+2){
o[v[i]/10].push_back(i+1);
}
for(int i=1;i<n;i=i+2){
e[v[i]/10].push_back(i+1);
}
count=0;
for(int i=0;i<10;i++){
int os=o[i].size(),es=e[i].size();
if(os==2)
count++;
if(es == 2)
count++;
if(os>2 || es>2)
count += 2;
}
cout<<count;
}