C++ 从零单排(5)- ACM三和总结

继续干!


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 程序设计-曾棕根


你可能感兴趣的:(C++ 从零单排(5)- ACM三和总结)