链接:http://www.luogu.org/problem/show?pid=1159
题意:给你n个当前排名的字符串,和当前排名相对上个月的排名是上升了还是下降了。求上个月的排名
解析:显然。如果当前排名是up,那么上个月的排名为[i + 1,n]。
如果是down ,那么上个月的排名是[1,i - 1]
细思:贪心的做法就是按照i增加的顺序让down的尽量往前排(尽量不要占用后[t + 1,n]的区间),让up也是尽量往前排。(下一次的i是更大的,不往前排就排不到了)
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <sstream> #include <string> #include <algorithm> #include <list> #include <map> #include <vector> #include <queue> #include <stack> #include <cmath> #include <cstdlib> using namespace std; char s[106][106],d[106][10]; int id[106],ans[106]; bool vis[106]; int main() { //freopen("in.txt","r",stdin); int n; scanf("%d",&n); for(int i = 1; i <= n; i ++) { scanf("%s%s",s[i],d[i]); if(d[i][0] == 'S') { id[i] = i; vis[i] = true; } } for(int i = 1; i <= n; i ++) { if(d[i][0] == 'D') { for(int j = 1; j < i; j ++) { if(vis[j]== false) { vis[j] = true; id[i] = j; break; } } } } for(int i = 1; i <= n; i ++) { if(d[i][0] =='U') { for(int j = i ; j <= n; j ++) { if(vis[j]== false) { vis[j] = true; id[i] = j; break; } } } } for(int i = 1; i <= n; i ++) { ans[id[i]] = i; } for(int i = 1; i <= n; i ++) { // cout<<ans[i]<<endl; printf("%s\n",s[ans[i]]); } return 0; }