1让气球升起
国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气球,气球越多就说明该队做的题目越多。当然如果一个颜色的气球越多就说明该气球对应的题也就越简单。现在给你很多很多的颜色的气球,问你那个颜色的气球最多,哈哈,聪明的acmer这题对你肯定很简单吧
假设只有6种颜色,green,red,blue,pink,orange,black。输入数据有多组,每组数据开始给出一个整数n代表接下来有n个气球,接下来有n行,每行输入一种颜色,n <= 100,输入以EOF结束。
输出个数最多的气球的颜色(题目保证个数最多的气球有且仅有一种颜色)
Sample Input
3
green
red
green
5
green
red
blue
red
red
Sample Output
green
red
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0; string str = "";
while(cin >> n) {
map<string,int> hash;
for(int i = 0; i < n; ++i) {
cin >> str;
++hash[str];
}
string ans = "";int cnt = 0;
for(map<string,int>::iterator it = hash.begin(); it != hash.end(); ++it) {
if(it -> second > cnt) {
cnt = it -> second;
ans = it -> first;
}
}
cout << ans << endl;
}
return 0;
}
2上网统计
在一个网络系统中有 N 个用户、M 次上网记录。每个用户可以自己注册一个用户名,每个用户名是一个只含小写字母且长度小于 1000 的字符串。每个上网的账号每次上网都会浏览网页,网页名是以一个只含小写字母且长度小于 1000 的字符串,每次上网日志里都会有记录,现在请统计每个用户每次浏览了多少个网页。
单组输入。
第 1 行包含两个用 1 个空格隔开的正整数 N(1≤N≤1000)和 M(1≤M≤5000)。
第 2到M+1 行,每行包含 2 个用 1 个空格隔开的字符串,分别表示用户名和浏览的网页名。
共 N 行,每行的第一个字符串是用户名,接下来的若干字符串是这个用户依次浏览的网页名(之间用一个空格隔开)。按照用户名出现的次序排序输出。
Sample Input
5 7
goodstudyer bookshopa
likespacea spaceweb
goodstudyer bookshopb
likespaceb spaceweb
likespacec spaceweb
likespacea juiceshop
gameplayer gameweb
Sample Output
goodstudyer bookshopa bookshopb
likespacea spaceweb juiceshop
likespaceb spaceweb
likespacec spaceweb
gameplayer gameweb
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 0, m = 0; cin >> n >> m;
map<string,queue<string> > hash;
vector<string> namevec;
string name = "", web = "";
for(int i = 0; i < m; ++i) {
cin >> name >> web;
hash[name].push(web);
if(find(namevec.begin(), namevec.end(), name) == namevec.end())
namevec.push_back(name);
}
for(vector<string>::iterator it = namevec.begin(); it != namevec.end(); ++it) {
cout << *it << " ";
while(!hash[*it].empty()) {
cout << hash[*it].front();
if(hash[*it].size() != 1) cout << " ";
hash[*it].pop();
}
cout << endl;
}
return 0;
}
3洗盘子
Bessie 和 Canmuu 将联手洗掉N (1<= N <= 10,000) 个脏盘子。
Bessie 洗; Canmuu 来擦干它们.
每个盘子有一个指定的编号,范围1..N. 开始,所有盘子按顺序排列在栈中,1号盘子在顶端,N号盘子在底端.
Bessie 会先洗一些盘子,然后放在洗过的盘子栈里(这样原来的顺序颠倒).
然后,或者她洗别的盘子,或者Canmuu 擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。
这样直到所有盘子洗完擦干后放置的顺序是什么?
Input
第一行: 一个整数N,表示盘子的数量
以下若干行: 每一行两个整数 ,第一整数为1表示洗盘子,为2表示擦盘子,第二个整数表示数量
Output
共N行:擦干后盘子从顶端到底端的顺序
Sample Input
5
1 3
2 2
1 2
2 3
Sample Output
1
4
5
2
3
#include<bits/stdc++.h> using namespace std; int main(){ int n = 0; cin >> n; stack<int> plates; stack<int> washed; queue<int> ans; for(int i = n; i >= 1; --i) plates.push(i); int a = 0, b = 0; while(cin >> a >> b) { if(a == 1) for(int i = 0; i < b; ++i) { int plate = plates.top(); plates.pop(); washed.push(plate); } else if(a == 2) for(int i = 0; i < b; ++i) { int plate = washed.top(); washed.pop(); ans.push(plate); } } while(!ans.empty()) { cout << ans.front() << endl; ans.pop(); } return 0; }
这里的输出是从底端到顶端的顺序,和题意相反了。将ans改成stack,ans.front()改为ans.top()即可