| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
竟然1次AC,太感动了,附代妈【用了一堆STL和stringstream以及插入排序都0ms,看来数据很水啊!】getline和stringstream大法好,管他什么空格换行的,yeah~
#include <iostream>
#include <stdio.h>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main() {
int rank1[110] = {0}, rank2[110] = {0};
int rankGs1[110] = {0}, rankGs2[110] = {0};
int rankToID1[110], rankToID2[110];
string s;
getline(cin, s);
stringstream ss1(s);
int n1;
ss1 >> n1;
int cnt = 1;
int mc = 1;
for(int i = 1; i <= n1; i++){
mc = cnt;
getline(cin, s);
stringstream temp(s);
int tmp;
while(temp >> tmp){
rank1[tmp] = mc;
rankGs1[mc] ++;
rankToID1[cnt] = tmp;
cnt++;
}
}
getline(cin, s);//空行忽略
getline(cin, s);
stringstream ss2(s);
int n2;
ss2 >> n2;
cnt = 1;
for(int i = 1; i <= n2; i++){
mc = cnt;
getline(cin, s);
stringstream temp(s);
int tmp;
while(temp >> tmp){
rank2[tmp] = mc;
rankGs2[mc] ++;
rankToID2[cnt] = tmp;
cnt++;
}
}
double rankings[110] = {0};//0表示没考慮过,-1表示无法确定
int dcjGs = 1;//都参加的人的个数
int dcj[110];
//for(int i = 0; i < 110; i++) rankings[i] = -1;
for(int i = 1; i <= 100; i++){
if(rank1[i] != 0 && rank2[i] != 0){
//两个都参加鸟
rankings[i] = rank1[i] + rank2[i];
dcj[dcjGs] = i;
dcjGs ++;
}
}
dcjGs --;
//蓝后考慮和参加两个的持平的
for(int i = 1; i <= dcjGs; i++){
int rk1 = rank1[dcj[i]], rk2 = rank2[dcj[i]];
double rkg =rankings[dcj[i]];
bool keyi1 = true, keyi2 = true;
for(int j = rk1; j < rk1+rankGs1[rk1]; j++){
int id = rankToID1[j];
if(rank2[id] != 0 && rankings[id] != rkg){
keyi1 = false;
break;
}
}
for(int j = rk1; j < rk1+rankGs1[rk1]; j++){
int id = rankToID1[j];
if(rank2[id] == 0) rankings[id] = keyi1 ? rkg : -1;
}
for(int j = rk2; j < rk2+rankGs2[rk2]; j++){
int id = rankToID2[j];
if(rank1[id] != 0 && rankings[id] != rkg){
keyi2 = false;
break;
}
}
for(int j = rk2; j < rk2+rankGs2[rk2]; j++){
int id = rankToID2[j];
if(rank1[id] == 0) rankings[id] = keyi2 ? rkg : -1;
}
}
//下面是贼麻烦的
//首先㞎都参加的排序
for(int i = 2; i <= dcjGs; i++){
for(int j = i; j > 1; j--){
if(rankings[dcj[j]] >= rankings[dcj[j-1]]) break;
int temp = dcj[j];
dcj[j] = dcj[j-1];
dcj[j-1] = temp;
}
}
int min1[202] = {0}, max1[202] = {0}, min2[202] = {0}, max2[202] = {0};
double rkgs[202] = {1,0};
double curRank = 1;
int curIdx = 0;
for(int i = 1; i <= dcjGs; i++){
if(rankings[dcj[i]] != curRank){
curIdx ++;
curRank = rankings[dcj[i]];
rkgs[curIdx] = curRank;
min1[curIdx] = rank1[dcj[i]];
max1[curIdx] = rank1[dcj[i]];
min2[curIdx] = rank2[dcj[i]];
max2[curIdx] = rank2[dcj[i]];
}
else{
if(min1[curIdx] > rank1[dcj[i]]) min1[curIdx] = rank1[dcj[i]];
if(max1[curIdx] < rank1[dcj[i]]) max1[curIdx] = rank1[dcj[i]];
if(min2[curIdx] > rank2[dcj[i]]) min2[curIdx] = rank2[dcj[i]];
if(max2[curIdx] < rank2[dcj[i]]) max2[curIdx] = rank2[dcj[i]];
}
}
curIdx ++;
rkgs[curIdx] = 202;
min1[curIdx] = 101;
max1[curIdx] = 101;
min2[curIdx] = 101;
max2[curIdx] = 101;
for(int i = 0; i < curIdx; i++){
if(max1[i+1] < max1[i]) max1[i+1] = max1[i];
if(max2[i+1] < max2[i]) max2[i+1] = max2[i];
}
for(int i = curIdx; i > 0; i--){
if(min1[i-1] > min1[i]) min1[i-1] = min1[i];
if(min2[i-1] > min2[i]) min2[i-1] = min2[i];
}
for(int i = 0; i < curIdx; i++){
double jiRank = rkgs[i];
vector<int> coll;
vector<int> ranks;
for(int j = max1[i] + 1; j < min1[i+1]; j++){
if(rankGs1[j] == 0) continue;
for(int k = 0; k < rankGs1[j]; k++){
coll.push_back(rankToID1[j+k]);
ranks.push_back(j);
}
}
for(int j = max2[i] + 1; j < min2[i+1]; j++){
if(rankGs2[j] == 0) continue;
for(int k = 0; k < rankGs2[j]; k++){
coll.push_back(rankToID2[j+k]);
ranks.push_back(j);
}
}
int sz = coll.size();
if(sz == 0) continue;
//内部排序
for(int j = 1; j < sz; j++){
for(int k = j; k > 0; k--){
if(ranks[k] > ranks[k-1] || (ranks[k] == ranks[k-1] && coll[k] > coll[k-1])) continue;
int temp = coll[k];
coll[k] = coll[k-1];
coll[k-1] = temp;
temp = ranks[k];
ranks[k] = ranks[k-1];
ranks[k-1] = temp;
}
}
int curK = 0;
for(int j = 0; j < sz; j++){
if(ranks[j] != curK){
curK = ranks[j];
jiRank += 0.001;
}
rankings[coll[j]] = jiRank;
}
}
vector<int> resIdx;
vector<double> resRank;
for(int i = 0; i < 110; i++){
if(rankings[i] == -1 || rankings[i] == 0) continue;
resIdx.push_back(i);
resRank.push_back(rankings[i]);
}
int size = resIdx.size();
for(int i = 1; i < size; i++){
for(int j = i; j > 0; j--){
if(resRank[j] > resRank[j-1] || (resRank[j] == resRank[j-1] && resIdx[j] > resIdx[j-1])) break;
int temp = resIdx[j];
resIdx[j] = resIdx[j-1];
resIdx[j-1] = temp;
double tmp = resRank[j];
resRank[j] = resRank[j-1];
resRank[j-1] = tmp;
}
}
double csRank = 0;
for(int i = 0; i < size; i++){
if(i > 0 && resRank[i] != csRank) printf("\n");
csRank = resRank[i];
printf("%d ", resIdx[i]);
}
printf("\n");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator