继续干!
List the Books
http://acm.zju.edu.cn/网上第 2727 题
以书名、出版年份和价格为关键词,按照排序标准把书进行排序。
注意:Name 是第一排序标准,Year 是第二排序标准,Price 是第三排序标准。
思路:定义书的结构体,首先把书的信息读到vector中,然后分别定义三个Compare方法。
#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> using namespace std; struct Book{ string name; int year; int price; }; bool CompName(const Book &b1,const Book &b2) { if(b1.name!=b2.name) return b1.name<b2.name; else if(b1.year!=b2.year) return b1.year<b2.year; else return b1.price<b2.price; } bool CompYear(const Book &b1,const Book &b2) { if(b1.year!=b2.year) return b1.year<b2.year; else if(b1.name!=b2.name) return b1.name<b2.name; else return b1.price<b2.price; } bool CompPrice(const Book &b1,const Book &b2) { if(b1.price!=b2.price) return b1.price<b2.price; else if(b1.name!=b2.name) return b1.name<b2.name; else return b1.year<b2.year; } int main() { ifstream cin("aaa.txt"); vector<Book> v; Book book; string sorting; int n; int i; int line = 0; while(cin>>n) { if(n==0) break; line++; v.clear(); for(i=0;i<n;i++) { cin>>book.name>>book.year>>book.price; v.push_back(book); } cin>>sorting; if(sorting=="Name") sort(v.begin(),v.end(),CompName); else if(sorting=="Year") sort(v.begin(),v.end(),CompYear); else if(sorting=="Price") sort(v.begin(),v.end(),CompPrice); //Out an empty line if(line!=1) cout<<endl; for(i=0;i<v.size();i++) { cout<<v[i].name<<" "<<v[i].year<<" "<<v[i].price<<endl; } } return 0; }
Windows Message Queue
http://acm.zju.edu.cn/网上第 2724 题
消息队列是 Windows 操作系统的基石。对于每个进程,系统维持了一个消息队列。
“GET”或“PUT”表示从消息队列里抓取消,对于每条“GET”命令,直接输出它抓取的消息的名称和参数在一行上。如果消息队列是空的,那么直接输出“EMPTY QUEUE!”。对于“PUT”命令,不需要输出什么。息或把消息放入消息队列。
思路:想到了STL中的优先级队列,剩下的就简单了。注意当数据量很大的时候,用scanf和printf来节省时间。
C++实现(混合了C):
#include <iostream> #include <fstream> #include <queue> #include <string.h> #include <algorithm> using namespace std; struct Message{ char Name[100]; int Data; int Priority; bool operator <(const Message &a) const { return a.Priority<Priority; } }; priority_queue<Message> v; int main() { char command[100]; Message message; while(scanf("%s",command)!=EOF) { if(strcmp(command,"GET")==0) { if(v.size()==0) printf("EMPTY QUEUE!\n"); else{ printf("%s %d\n",v.top().Name,v.top().Data); v.pop(); } } else if(strcmp(command,"PUT")==0) { scanf("%s%d%d",&message.Name,&message.Data,&message.Priority); v.push(message); } } return 0; }
好的,ACM就先到这。
总结
来来去去做了一些题,也看了一些题。
好在有一些参考书,自己的基础也还好,学习的比较顺利。
但并不是非常地快乐。
关于算法,虽然很多人和我说一定要注重,但我还是觉得应该是实用为主,比如学图形学可以去研究光线追踪,做游戏寻路,就学A*,A+。
但让我单纯去研究算法本身,还是有些DT..
最近比较关注的是两个英语单词-motivation,passion。
动力和激情实在是太重要了。
对于A题-冥思苦想N个钟头,才能在屏幕上看到一个红色的Accept,说真的,很难让我感到激动还有成功的喜悦,况且,还不一定能够A掉它。
我还是适合去创造一些事物,那种从无到有的过程才能给自己带来最大的快乐。
C++从零单排系列也暂时告一段落。
参考书籍:
ACM 程序设计-曾棕根