当前位置:实例文章 » 其他实例» [文章][USACO22JAN] Farm Updates G

[USACO22JAN] Farm Updates G

发布人:shili8 发布时间:2024-11-09 05:08 阅读次数:0

**Farm Updates**

**Problem Description**

在一个农场中,牛奶生产商需要定期更新牛的信息。每个牛都有一个唯一的 ID 号,以及其所产奶量、牛奶价格以及牛的健康状况等信息。牛奶生产商希望能够快速地查找某一特定牛的信息,并且能够对所有牛的信息进行排序和统计。

**Problem Requirements**

1. **查找牛的信息**: 需要能够根据 ID 号快速找到某一特定牛的信息。
2. **排序牛的信息**: 需要能够按照奶量、价格或健康状况等不同维度对所有牛的信息进行排序。
3. **统计牛的信息**: 需要能够统计出所有牛的平均奶量、最高奶量、最低奶量等信息。

**Solution**

为了解决这个问题,我们可以使用一个基于链表的数据结构来存储每个牛的信息。链表的特点是插入和删除操作非常快,适合频繁查找和排序的场景。

### 牛类定义

cppclass Cow {
public:
 int id; // 牛的ID号 double milkQuantity; // 牛产奶量 double price; // 牛奶价格 string healthStatus; // 牛的健康状况 Cow(int id, double milkQuantity, double price, string healthStatus) {
 this->id = id;
 this->milkQuantity = milkQuantity;
 this->price = price;
 this->healthStatus = healthStatus;
 }
};


### 链表类定义
cppclass LinkedList {
private:
 struct Node {
 Cow cow;
 Node* next;

 Node(Cow cow) : cow(cow), next(nullptr) {}
 };

public:
 Node* head; // 链表头结点 LinkedList() : head(nullptr) {}

 ~LinkedList() {
 while (head != nullptr) {
 Node* temp = head;
 head = head->next;
 delete temp;
 }
 }

 void addCow(Cow cow) {
 Node* newNode = new Node(cow);
 if (head == nullptr) {
 head = newNode;
 } else {
 Node* current = head;
 while (current->next != nullptr) {
 current = current->next;
 }
 current->next = newNode;
 }
 }

 Cow* findCow(int id) {
 Node* current = head;
 while (current != nullptr) {
 if (current->cow.id == id) {
 return ¤t->cow;
 }
 current = current->next;
 }
 return nullptr; // 未找到匹配的牛 }

 void sortCowByMilkQuantity() {
 Node* current = head;
 while (current != nullptr) {
 Node* nextNode = current->next;
 while (nextNode != nullptr) {
 if (current->cow.milkQuantity < nextNode->cow.milkQuantity) {
 Cow temp = current->cow;
 current->cow = nextNode->cow;
 nextNode->cow = temp;
 }
 nextNode = nextNode->next;
 }
 current = current->next;
 }
 }

 void sortCowByPrice() {
 Node* current = head;
 while (current != nullptr) {
 Node* nextNode = current->next;
 while (nextNode != nullptr) {
 if (current->cow.price < nextNode->cow.price) {
 Cow temp = current->cow;
 current->cow = nextNode->cow;
 nextNode->cow = temp;
 }
 nextNode = nextNode->next;
 }
 current = current->next;
 }
 }

 void sortCowByHealthStatus() {
 Node* current = head;
 while (current != nullptr) {
 Node* nextNode = current->next;
 while (nextNode != nullptr) {
 if (current->cow.healthStatus < nextNode->cow.healthStatus) {
 Cow temp = current->cow;
 current->cow = nextNode->cow;
 nextNode->cow = temp;
 }
 nextNode = nextNode->next;
 }
 current = current->next;
 }
 }

 void printAllCowInfo() {
 Node* current = head;
 while (current != nullptr) {
 cout << "ID: " << current->cow.id << ", Milk Quantity: " << current->cow.milkQuantity << ", Price: " << current->cow.price << ", Health Status: " << current->cow.healthStatus << endl;
 current = current->next;
 }
 }

 void printAverageMilkQuantity() {
 double sum =0.0;
 Node* current = head;
 while (current != nullptr) {
 sum += current->cow.milkQuantity;
 current = current->next;
 }
 cout << "Average Milk Quantity: " << sum / countCow() << endl;
 }

 void printHighestMilkQuantity() {
 double highest =0.0;
 Node* current = head;
 while (current != nullptr) {
 if (current->cow.milkQuantity > highest) {
 highest = current->cow.milkQuantity;
 }
 current = current->next;
 }
 cout << "Highest Milk Quantity: " << highest << endl;
 }

 void printLowestMilkQuantity() {
 double lowest =1000000.0; // 初始值设为较大 Node* current = head;
 while (current != nullptr) {
 if (current->cow.milkQuantity < lowest) {
 lowest = current->cow.milkQuantity;
 }
 current = current->next;
 }
 cout << "Lowest Milk Quantity: " << lowest << endl;
 }

private:
 int countCow() {
 int count =0;
 Node* current = head;
 while (current != nullptr) {
 count++;
 current = current->next;
 }
 return count;
 }
};


### 主函数
cppint main() {
 LinkedList linkedList;

 // 添加牛的信息 Cow cow1(1,1000.0,5.0, "健康");
 Cow cow2(2,2000.0,10.0, "不健康");
 Cow cow3(3,3000.0,15.0, "健康");

 linkedList.addCow(cow1);
 linkedList.addCow(cow2);
 linkedList.addCow(cow3);

 // 查找牛的信息 Cow* foundCow = linkedList.findCow(2);
 if (foundCow != nullptr) {
 cout << "Found cow with ID: " << foundCow->id << endl;
 } else {
 cout << "未找到匹配的牛" << endl;
 }

 // 排序牛的信息 linkedList.sortCowByMilkQuantity();
 cout << "Sorted by milk quantity:" << endl;
 linkedList.printAllCowInfo();

 linkedList.sortCowByPrice();
 cout << "Sorted by price:" << endl;
 linkedList.printAllCowInfo();

 linkedList.sortCowByHealthStatus();
 cout << "Sorted by health status:" << endl;
 linkedList.printAllCowInfo();

 // 统计牛的信息 linkedList.printAverageMilkQuantity();
 linkedList.printHighestMilkQuantity();
 linkedList.printLowestMilkQuantity();

 return0;
}


### 总结本文介绍了一个基于链表的数据结构来存储每个牛的信息,并提供了相关函数来查找、排序和统计牛的信息。通过使用链表,我们可以快速地插入和删除牛的信息,适合频繁查找和排序的场景。

相关标签:算法深度优先图论
其他信息

其他资源

Top