• 1095 解码PAT准考证 (25分)


    超时的话试一试将cin、cout换成scanf,printf

    map换成unordered_map

    map很好用

    unordered_map可以避免超时!!
    同类型题汇总:

    1085 PAT单位排行 (25分)

    1080 MOOC期终成绩

    我的代码,不好意思是错的

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    #define max1 10010
    #define max2 1000
    struct info {
    	string testId;
    	int score;
    }stu[max1];
    
    struct result {
    	string testId;
    	int score;
    }res[max1];
    
    struct res3 {
    	int place;
    	int sum = 0;
    }count3[max2];
    
    bool cmp1(result a,result b){
    	if (a.score != b.score) {
    		return a.score > b.score;
    	}
    	else {
    		return a.testId < b.testId;
    	}	
    }
    
    bool cmp2(res3 a, res3 b) {
    	return a.sum > b.sum;
    }
    
    int main() {
    	int n, m;
    	int i, j;
    	cin >> n >> m;
    	for (i = 0; i < n; i++) {
    		cin >> stu[i].testId;
    		cin >> stu[i].score;
    	}
    	int type;//指令类型
    	string temp;//指令内容
    	string t; //缓存
    	int sum;
    	for (j = 0; j < n; j++) {
    		cin >> type;
    		cin >> temp;
    		cout << "Case " << j + 1 << ": " << type << " " << temp << endl;
    		if (type == 1) {
    			sum = 0;
    			for (i = 0; i < n; i++) {
    				t = stu[i].testId.substr(0, 1); //等级TAB
    				if (t.compare(temp) == 0) {
    					res[sum].testId = stu[i].testId;
    					res[sum].score = stu[i].score;
    					sum++;
    				}
    			}
    			sort(res, res + sum, cmp1);
    			for (int m = 0; m < sum; m++) {
    				cout << res[m].testId << " ";
    				cout << res[m].score << endl;
    			}
    			if (sum == 0) {
    				cout << "NA" << endl;
    			}
    		}
    		else if (type == 2) {
    			sum = 0;
    			int total = 0;
    			for (i = 0; i < n; i++) {
    				t = stu[i].testId.substr(1, 3); //等级TAB
    				if (t.compare(temp) == 0) {
    					sum++;
    					total += stu[i].score;
    				}
    			}
    			if (sum > 0) {
    				cout << sum << " " << total << endl;
    			}
    			else {
    				cout << "NA" << endl;
    			}
    		}
    		else if (type == 3) {
    			int m = 0;
    			sum = 0;
    			for (i = 0; i < n; i++) {
    				t = stu[i].testId.substr(4, 6); //等级TAB
    				if (t.compare(temp) == 0) {
    					sum++;
    					string test = stu[i].testId.substr(1, 3);
    					int tt = stoi(test);
    					count3[tt].place = tt;
    					count3[tt].sum++;
    				}
    			}
    			sort(count3, count3 + max2, cmp2);
    			for (i = 0; i < max2; i++) {
    				if (count3[i].sum == 0) {
    					break;
    				}
    				else {
    					cout << count3[i].place << " " << count3[i].sum << endl;
    				}
    			}
    			if (sum == 0) {
    				cout << "NA" << endl;
    			}
    		}
    	}
    	return 0;
    }
    

    人家的代码

    一道超时让我怀疑人生的题目,一开始只用的c,19分,超时,直到现在也没想出来为啥,后来百度到用map容器解决关于第三种情况,但是敲了还是超时,崩溃,还是19分,想了半天,最后发现将所有的输出改成printf就对了,用cout的话,不行, 还有使用map的时候,因为map会自动将键值从小到大排序,然后还会导致超时,好像是22分,如果用无排序的map,25分
    ————————————————
    版权声明:本文为CSDN博主「依久_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/acm_zh/java/article/details/86429864

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<unordered_map>
    using namespace std;
    
    struct Node {
        string t;
        int value;
    };
    
    bool cmp(const Node& a, const Node& b) {
        return a.value != b.value ? a.value > b.value : a.t < b.t;
    }
    
    int main() {
        int n, m, score, num;
        string s;
        cin >> n >> m;
        vector<Node> v(n);
    
        for (int i = 0; i < n; i++)
            cin >> v[i].t >> v[i].value;
        for (int i = 1; i <= m; i++) {
            cin >> num >> s;
            printf("Case %d: %d %s
    ", i, num, s.c_str());
            vector<Node> ans;
            int cnt = 0, score = 0;
            if (num == 1) {
                for (int j = 0; j < n; j++) {
                    if (v[j].t[0] == s[0]) ans.push_back(v[j]);
                }
            }
            else if (num == 2) {
                for (int j = 0; j < n; j++) {
                    if (v[j].t.substr(1, 3) == s) {
                        cnt++;
                        score += v[j].value;
                    }
                }
                if (cnt != 0) printf("%d %d
    ", cnt, score);
            }
            else if (num == 3) {
                unordered_map<string, int> m;
                for (int j = 0; j < n; j++) {
                    if (v[j].t.substr(4, 6) == s) m[v[j].t.substr(1, 3)]++;
                }
                for (auto it : m) ans.push_back({ it.first, it.second });
            }
            sort(ans.begin(), ans.end(), cmp);
            for (int j = 0; j < ans.size(); j++) {
                printf("%s %d
    ", ans[j].t.c_str(), ans[j].value);
            }
            if (((num == 1 || num == 3) && ans.size() == 0) || (num == 2 && cnt == 0))
                printf("NA
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    LamBda学习(一)
    如何返回一个只读泛型集合
    Socket编程笔记同步
    如何快速读取大文件(看csdn一网友要求写的)没有测试具体的速度。
    如何实现项目脚本的批量生成
    如何实现WORD查找完成后不提示的代码
    W32/Pate.a 病毒处理小记
    在WORD中用VBA实现光标移动与内容选择
    2. WCF 消息操作
    3. WCF 异常处理
  • 原文地址:https://www.cnblogs.com/tanghm/p/12666350.html
Copyright © 2020-2023  润新知