#P3048. 数据分类(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 116
            Accepted: 49
            Difficulty: 2
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>模拟          
 
数据分类(100分)
题面描述
给定12个数据,其中第一个数据为c,第二个数据为b,剩余的10个数据为需要分类的数据a。分类方法如下:
- 对每个数据
a,将其视为一个四字节(32位)的无符号整数。 - 提取
a的四个字节,分别为高位到低位的字节。 - 计算这四个字节的和,然后对给定的值
b取模,得到sum_mod。 - 如果
sum_mod小于c,则该数据a为有效类型,其类型为sum_mod;否则,该数据为无效类型。 
最终,需要在所有有效类型中,找到包含数据最多的类型,并输出该类型所包含的数据个数。
思路
- 输入处理:首先读取12个整数,其中第一个是
c,第二个是b,其余10个是需要分类的数据a。 - 字节提取与求和:对于每个数据
a,提取其四个字节,并计算这四个字节的和。 - 取模与分类:
- 计算
sum_mod = sum_of_bytes % b。 - 如果
sum_mod < c,则该数据为有效类型,类型为sum_mod。 - 否则,该数据为无效类型。
 
 - 计算
 - 统计有效类型:使用一个数组或哈希表统计每种有效类型出现的次数。
 - 找到最大计数:遍历统计结果,找到出现次数最多的有效类型,并输出其计数。
 
cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main(){
    // 读取12个整数,分别赋值给c, b和data数组
    int c, b;
    cin >> c >> b;
    vector<unsigned int> data(10);
    for(int i=0;i<10;i++) cin >> data[i];
    
    // 使用一个哈希表统计各有效类型的出现次数
    unordered_map<int, int> type_count;
    
    for(auto a : data){
        // 提取四个字节
        unsigned int byte1 = (a >> 24) & 0xFF;
        unsigned int byte2 = (a >> 16) & 0xFF;
        unsigned int byte3 = (a >> 8) & 0xFF;
        unsigned int byte4 = a & 0xFF;
        
        // 计算字节和
        int sum = byte1 + byte2 + byte3 + byte4;
        
        // 计算sum_mod
        if(b == 0){
            // 避免除以0
            continue;
        }
        int sum_mod = sum % b;
        
        // 判断是否为有效类型
        if(sum_mod < c){
            type_count[sum_mod]++;
        }
    }
    
    // 找到最大计数
    int max_count = 0;
    for(auto &p : type_count){
        if(p.second > max_count){
            max_count = p.second;
        }
    }
    
    // 输出结果
    cout << max_count;
    
    return 0;
}
python
# 读取输入
input_values = list(map(int, input().split()))
c, b = input_values[0], input_values[1]
data = input_values[2:]
# 使用字典统计有效类型的出现次数
type_count = {}
for a in data:
    # 提取四个字节
    byte1 = (a >> 24) & 0xFF
    byte2 = (a >> 16) & 0xFF
    byte3 = (a >> 8) & 0xFF
    byte4 = a & 0xFF
    
    # 计算字节和
    sum_bytes = byte1 + byte2 + byte3 + byte4
    
    # 计算sum_mod
    if b == 0:
        # 避免除以0
        continue
    sum_mod = sum_bytes % b
    
    # 判断是否为有效类型
    if sum_mod < c:
        if sum_mod in type_count:
            type_count[sum_mod] += 1
        else:
            type_count[sum_mod] = 1
# 找到最大计数
max_count = 0
for count in type_count.values():
    if count > max_count:
        max_count = count
# 输出结果
print(max_count)
java
import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        // 读取c和b
        int c = sc.nextInt();
        int b = sc.nextInt();
        
        // 读取10个数据a
        long[] data = new long[10];
        for(int i=0;i<10;i++) data[i] = sc.nextLong();
        
        // 使用HashMap统计有效类型的出现次数
        HashMap<Integer, Integer> typeCount = new HashMap<>();
        
        for(long a : data){
            // 提取四个字节
            int byte1 = (int)((a >> 24) & 0xFF);
            int byte2 = (int)((a >> 16) & 0xFF);
            int byte3 = (int)((a >> 8) & 0xFF);
            int byte4 = (int)(a & 0xFF);
            
            // 计算字节和
            int sum = byte1 + byte2 + byte3 + byte4;
            
            // 计算sum_mod
            if(b == 0){
                // 避免除以0
                continue;
            }
            int sum_mod = sum % b;
            
            // 判断是否为有效类型
            if(sum_mod < c){
                typeCount.put(sum_mod, typeCount.getOrDefault(sum_mod, 0) + 1);
            }
        }
        
        // 找到最大计数
        int maxCount = 0;
        for(int count : typeCount.values()){
            if(count > maxCount){
                maxCount = count;
            }
        }
        
        // 输出结果
        System.out.println(maxCount);
    }
}
        题目描述
对一个数据 a 进行分类,分类方法为:
此数据 a(四个字节大小)的四个字节相加对一个给定的值 b 取模,如果得到的结果小于一个给定的值 c ,则数据 a 为有效类型,其类型为取模的值;如果得到的结果大于或者等于 c ,则数据 a 为无效类型。
比如一个数据 a=0x01010101,b=3,按照分类方法计算(0×01+0×01+0×01+0×01)%3=1,
所以如果 c=2 ,则此 a 为有效类型,其类型为 1 ,如果 c=1 ,则此 a 为无效类型;
又比如一个数据 a=0x01010103 ,b=3 ,按照分类方法计算(0×01+0×01+0×01+0×03)%3=0,
所以如果 c=2 ,则此 a 为有效类型,其类型为 0 ,如果 c=0 ,则此 a 为无效类型。
输入 12 个数据,第一个数据为 c ,第二个数据为 b ,剩余 10 个数据为需要分类的数据,
请找到有效类型中包含数据最多的类型,并输出该类型含有多少个数据。
输入描述
输入 12 个数据,用空格分隔,第一个数据为 c ,第二个数据为 b ,剩余 10 个数据为需要分类的数据。
输出描述
输出最多数据的有效类型有多少个数据。
样例1
输入
3 4 256 257 258 259 260 261 262 263 264 265
输出
3
说明
10 个数据 4 个字节相加后的结果分别为 1 2 3 4 5 6 7 8 9 10 ,
故对 4 取模的结果为 1 2 3 0 1 2 3 0 1 2,c 为 3 ,所以 0 1 2 都是有效类型,类型为 1 和 2 的有 3 个数据,类型为 0 的只有 2 个数据,故输出 3。
样例2
输入
1 4 256 257 258 259 260 261 262 263 264 265
输出
2
说明
10个数据 4 个字节相加后的结果分别为 1 2 3 4 5 6 7 8 9 10,
故对 4 取模的结果为 1 2 3 0 1 2 3 0 1 2,c为1,
所以只有0是有效类型,类型为0的有2个数据,故输出2。