参考代码:

#include <bits/stdc++.h>using namespace std;int n;int rot[15], ans[15] = {0};    //别离存储不同次幂对应的系数void dfs(int now, int exp, int an){    if(now == n){        ans[exp] += an;        return;    }    dfs(now+1,exp+1, an);    dfs(now+1, exp, an*rot[now]);}int main(){    int root;    scanf("%d", &n);    for(int i = 0; i < n; i++){        scanf("%d", &rot[i]);        rot[i] = -rot[i];    }    dfs(0,0,1); //前面相乘的参量初始化为1    for(int i = n-1; i >= 0; i--)   printf("%d%s", ans[i], i == 0 ? "\n" : " ");    return 0;}

参考代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 10010;const int INF = 0x3fffffff;struct triple{    int pos1, pos2, pos3;};int seq1[maxn], seq2[maxn], seq3[maxn];int dis(int p1, int p2, int p3){    int maxNum = max(max(seq1[p1], seq2[p2]), seq3[p3]);    int minNum = min(min(seq1[p1], seq2[p2]), seq3[p3]);    return (maxNum-minNum)*2;}int main(){    int n1, n2, n3;    scanf("%d %d %d", &n1, &n2, &n3);    for(int i = 0; i < n1; i++) scanf("%d", &seq1[i]);    for(int i = 0; i < n2; i++) scanf("%d", &seq2[i]);    for(int i = 0; i < n3; i++) scanf("%d", &seq3[i]);    sort(seq1, seq1+n1);    sort(seq2, seq2+n2);    sort(seq3, seq3+n3);    int p1 = 0, p2 = 0, p3 = 0;    int minD = INF;    triple ans;    while(1){        int maxNum = max(max(seq1[p1], seq2[p2]), seq3[p3]);        int minNum = min(min(seq1[p1], seq2[p2]), seq3[p3]);        if((maxNum-minNum)*2 <= minD){            minD = (maxNum-minNum)*2;            ans.pos1 = p1;            ans.pos2 = p2;            ans.pos3 = p3;        }        if(seq1[p1] == minNum){            p1++;            if(p1 == n1)    break;        }        else if(seq2[p2] == minNum){            p2++;            if(p2 == n2)    break;        }        else{            p3++;            if(p3 == n3)    break;        }    }    //最初这部分调节很重要,即调节两头的数字使其最大但不影响总的最小间隔    while(ans.pos1+1 < n1 && minD == dis(ans.pos1+1, ans.pos2, ans.pos3))   ans.pos1++;    while(ans.pos2+1 < n2 && minD == dis(ans.pos1, ans.pos2+1, ans.pos3))   ans.pos2++;    while(ans.pos3+1 < n3 && minD == dis(ans.pos1, ans.pos2, ans.pos3+1))   ans.pos3++;    printf("MinD(%d, %d, %d) = %d\n", seq1[ans.pos1], seq2[ans.pos2], seq3[ans.pos3], minD);    return 0;}


参考代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 10010;struct student{    int id, score;}stu[1010];struct node{    int id;    int num = 0, totalS = 0;}isRoot[maxn];int n;int father[maxn];int exist[maxn] = {0};vector<node> ans;void init(){    for(int i = 0; i < maxn; i++){        father[i] = i;    }}int findFather(int a){    int x = a;    while(a != father[a]){        a = father[a];    }    while(x != a){        int tmp = father[x];        father[x] = a;        x = tmp;    }    return a;}void Union(int a, int b){    int fa = findFather(a);    int fb = findFather(b);    if(fa < fb) father[fb] = fa;    else if(fb < fa)    father[fa] = fb;}bool cmp(node a, node b){    if(a.totalS != b.totalS)    return a.totalS > b.totalS;    else if(a.num != b.num) return a.num < b.num;    else    return a.id < b.id;}int main(){    init();    int k, teammate, score;    scanf("%d", &n);    for(int i = 0; i < n; i++){        scanf("%d %d", &stu[i].id, &k);        exist[stu[i].id] = 1;        for(int j = 0; j < k; j++){            scanf("%d", &teammate);            exist[teammate] = 1;            Union(stu[i].id, teammate);        }        scanf("%d", &stu[i].score);    }    for(int i = 0; i < n; i++){//只能统计分数信息        int f = findFather(stu[i].id);        isRoot[f].id = f;        isRoot[f].totalS += stu[i].score;    }    for(int i = 0; i < maxn; i++){//统计人数信息        if(exist[i]){            int f = findFather(i);  //此处i就是学生id不要再调用.id了            isRoot[f].num++;        }    }    for(int i = 0; i < maxn; i++){        if(isRoot[i].num)   ans.push_back(isRoot[i]);    }    sort(ans.begin(), ans.end(), cmp);    cout << ans.size() << endl;    for(int i = 0; i < ans.size(); i++) printf("%04d %d %d\n", ans[i].id, ans[i].num, ans[i].totalS);    return 0;}


参考代码:

#include <bits/stdc++.h>using namespace std;const int maxn = 100010;int n, money;int item[maxn], coupon[maxn];struct node{    int id1, id2;   //别离代表商品编号和代金券编号    friend bool operator < (node a, node b){        return item[a.id1] - coupon[a.id2] > item[b.id1] - coupon[b.id2];    }};bool cmp(int a, int b){    return a > n;}int main(){    scanf("%d %d", &n, &money);    for(int i = 0; i < n; i++)  scanf("%d", &item[i]);    for(int i = 0; i < n; i++)  scanf("%d", &coupon[i]);    sort(item, item+n);    sort(coupon, coupon+n, cmp);    priority_queue<node> q;    for(int i = 0; i < n; i++){        q.push(node{i, 0});    }    int cnt = 0;    while(!q.empty()){        node first = q.top();        q.pop();        if(money >= item[first.id1] - coupon[first.id2]){            money -= (item[first.id1]-coupon[first.id2]);            cnt++;            if(first.id2+1 < n) q.push(node{first.id1, first.id2+1});   //最初的id2用+1不要用++        }else   break;    }    printf("%d %d\n", cnt, money);    return 0;}