输入第一行为一个正整数T(T <= 10),表示有T组数据。 每组数据第一行,输入两个正整数N,M(1 < N <= 1000,1 <= M <= 10000),以下M行,每行代表一位观众提供的信息,第一个数是C(2 <= C <= N),表示他所记得的c位运动员的信息后面是C个整数Xi(1 <= Xi <= N),表示C位运动员冲过终点的顺序,排在前面的为先冲过终点的运动员。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
vector<int> g[N];//存储第i个人前面有哪些人
int deg[N];
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
g[i].clear();//初始化g[N]
deg[i] = 0;//初始化deg[N]
}
set<int> st;//存储运动员序号
while (m--) {
int c; cin >> c;
vector<int> v(c);//存储一个人看到的顺序
for (auto &i : v) {
cin >> i;
st.insert(i);//输入一个人看见的运动员序号
}
//一个人看见的运动员序号输入完毕
for (int i = 1; i < v.size(); i++) {
g[v[i]].push_back(v[i - 1]);//i-1为排在i前面的人,将i-1运动员的序号加入到g[i]中
deg[v[i - 1]]++;//v[i-1]运动员的位序+1
}
}
if (st.size() == n) {//输入运动员个数与人们给与的个数相符合
stack<int> ans;//存储最后输出的次序
queue<int> Q;
for (int i = 1; i <= n; i++) if (deg[i] == 0) Q.push(i);//deg[i]为0说明i是最后一名 取deg=0的人加入队列Q
int num = 0; bool ok = 1;
while (!Q.empty()) {
if (Q.size() > 1) ok = 0;//最后一个人的个数大于1 不符合 无法判断所有运动员次序
int x = Q.front();//取出队首元素
Q.pop();//弹出队首元素
num++;//弹出的运动员个数+1
ans.push(x);//记录最后输出次序
for (auto v : g[x]) {
deg[v]--;//排在x前面的所有人的位次序-1;
if (deg[v] == 0) Q.push(v);//此时排名最后的加入Q
}
}
if (ok == 1) {
while (!ans.empty()) {
cout << ans.top() << " ";//输出最终排序
ans.pop();
}
cout << endl;
}
else {
puts("NO");
}
}
else {
puts("NO");
}
}
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e9 + 7;
struct node {
int a;
int w;
node(int _a, int _w) {
a = _a;
w = _w;
}
bool operator < (const node & b)const {
if (a == 100)return false;
if (b.a == 100)return true;
if (w == b.w)return a > b.a;
return (100 - (a + 1) + (a + 1)*w) * (100 - b.a + b.a*b.w)
< (100 - a + a*w) * (100 - (b.a + 1) + (b.a + 1)*b.w);
}
};
int main() {
int T; cin >> T;
while (T--) {
int n, k;
ll ans = 1;
cin >> n >> k;
priority_queue<node> q;
for (int i = 0; i < n; i++)
{
int a, w;
cin >> a >> w;
q.push(node(a, w));
}
while (k && !q.empty()) {
node t = q.top();
q.pop();
if (t.a < 100) {
t.a++;
k--;
q.push(t);
}
else {
ans = (ans * t.w) % M;
}
}
while (!q.empty()) {
node t = q.top();
q.pop();
if (t.a) ans = (ans * (100 - t.a + t.a*t.w)) % M;
else ans *= 100;
}
cout << ans % M << endl;
}
}