uva156 codeforces 959B
uva156
题目描述
输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中大小写,按照字典序进行排序。
输入
1 2 3 4
| ladder came tape soon leader acme RIDE lone Dreis peat ScAlE orb eye Rides dealer NotE derail LaCeS drIed noel dire Disk mace Rob dries #
|
输出
1 2 3 4 5 6 7
| Disk NotE derail drIed eye ladder soon
|
解析
其实这道题挺简单的,把所有单词变成小写,然后排序,然后放到map里面,没有重复的就输出,但是自己写的过程中还是出了点问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <map> #include <cctype> #include <string> #include <vector> #include <iostream> #include <algorithm> using namespace std;
string repr(const string&s) { string ans = s; for(int i = 0; i < ans.length(); i++) ans[i] = tolower(ans[i]); sort(ans.begin(), ans.end()); return ans; } int main() { string s; vector<string> words; map<string, int> cnt; while(cin >> s) { if(s[0] == '#') break; words.push_back(s); string r = repr(s); if(!cnt.count(r)) cnt[r] = 0; cnt[r]++; } vector<string> ans; for(int i = 0; i < words.size(); i++) { if(cnt[repr(words[i])] == 1) ans.push_back(words[i]); } sort(ans.begin(), ans.end()); for(int i = 0; i < ans.size(); i++) cout << ans[i] << endl; return 0; }
|
总的来说,差不多就是先把要输入的单词经过处理后放到map里面,然后记录出现的次数,一点注意就是函数不能直接处理存放所有单词的数组,因为要按照原样输出,所以在处理函数里面赋值给了一个新的字符串,然后返回,最后再遍历一次map,把满足条件的输出。其实这里处理了两次,一次在输入后处理后放到map,一次是把words数组里面的元素处理后当做map的key去判断改key有没有满足这个条件。
codeforces 959B
一个人给另一个人发消息,其中发的消息里面的信息,每一个信息都有对应的价值,也就是发送的成本。 这个想发送的成本最低。输出最低的成本。代表输入n个已知的信息,下面一行对应每个信息的价值。然后是k行,每一行第一个就代表有x个可以互相替换的信息的下标。
参考:csdn
题解
模拟 这道题两秒 暴力大法好 用map用string longlong 对应值。耐心模拟就好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <iostream> #include <map> #include <string> #include <algorithm> #include <climits> using namespace std;
map<string,int> gr; string arr[100005]; int cost[100005]; int gcost[100005]; int n,k,m; int main() { cin >> n >> k >> m; int i; for(i=0;i<n;i++) cin >> arr[i]; for(i=0;i<n;i++) cin >> cost[i]; for(i=0;i<k;i++) { gcost[i]=INT_MIN; int x; cin >> x; while(x--) { int z; cin >> z; z--; gcost[i]=min(gcost[i],cost[z]); gr[arr[z]]=i; } } long long ans=0; for(i=0;i<m;i++) { string x; cin >> x; ans+=gcost[gr[x]]; } cout << ans << endl; }
|