對於兩場都參加的隊伍,兩場名次之和較小的排前面。
對於只參加一場的隊伍,在不衝突的情況下和與其該場同名次的且參加了兩場的另一支隊伍總排名相同。
對於不滿足上述的只參加一場的隊伍,看是否可以插入乙個位置,這個位置前面的隊伍都是該場在其前面的隊伍,後面的隊伍也都是該場在其後面的隊伍。多個能插入同位置的隊伍,按他們在自己那一場的排名來比較。
對於以上條件都不滿足的隊伍,忽略掉。
輸出的時候同名次隊伍要在一行中按隊伍id公升序輸出。
1//把只參加一場的另一場名次賦值為同一場同名次隊伍另一場的名次,但是不直接賦值,而2//
先快取(nex),並統計快取次數(cgcnt),如果快取僅一次,即沒有總名次不同隊伍的3//
衝突,則真正把另一場賦值為nex。之後進行第一次排序。4//
對於只參加一場而無其他參加兩場的同名次隊伍時,判斷是否可合理插入,記錄插入位置5//
之後進行第二次排序,針對這次處理的這類隊伍進行比較。6//
輸出,終名次相同者輸出在同一行。7//
單獨寫了完整的名次比較函式compab(),函式中順帶處理了前兩點所需資料。
8 #include9 #include
10 #include11 #include12
const
int maxn = 101
;13 typedef struct
14 team;
21team te[maxn];
22int
n, m;
23char buf[10001
];24
void readdata(int n, int
ith)
2540}41
}42}43
int compab(team &a, team &b)
4455
if(a.rt[0] && a.rt[1] && !(b.rt[0] && b.rt[1
]))56
63else
if(b.rt[1] == a.rt[1
])64
69return -1;70
}71if(b.rt[0] && b.rt[1] && !(a.rt[0] && a.rt[1
]))72
79else
if(a.rt[1] == b.rt[1
])80
85return1;
86}87if((a.rt[0] && a.rt[1]) && (b.rt[0] && b.rt[1
]))88
return a.rt[0] + a.rt[1] - b.rt[0] - b.rt[1
];89
if((a.rt[0] || a.rt[1]) && (b.rt[0] || b.rt[1
]))9095}
96int comp(const
void *a, const
void *b)
97100
int judge(team &a, int
ith)
101112
intmain()
113133
}134 qsort(te + 1, 100, sizeof
(team), comp);
135for(i = 1; i < maxn; ++i)
136142 qsort(te + 1, 100, sizeof
(team), comp);
143for(i = 1; (te[i].rt[0] || te[i].rt[1]) && i < maxn; i =j)
144150
}151
return0;
152 }
poj解題報告 1328
不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...
poj解題報告 2586
這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...
poj解題報告 2635
這題特別好理解,就是 坑啊。題意就是給乙個數,這個數是兩個大素數的積,再給出乙個數,如果最小的素數比給的數大,列印good,否則列印bad和最小的素數。這題用的方法是高精度求模 同餘模定理。還有素數打表,把10 6內的素數全部預打表,在求模時則列舉到小於l為止。注意打表不能只打到100w,要保證素數...