Permutation Counting
思路:在扫雷中,地雷对上下左右等八个方向产生数字影响,如果s<25,可以按一行将‘X’与.间隔输出,如果,s>=25,可以将s分解成8a+3b的形式,每个'X'相互间隔使的总数字对应每个‘X’加8,每个X相互在最后一排连续,课使得总数字对应每个‘X’加3。

#include <iostream>
#include <algorithm>
using namespace std;
int s,t;
int c[30][30];

int main()
{
scanf("%d",&t);
    while(t--)
    {
        scanf("%d", &s);
        if (s < 25)
        {
            printf("%d %d\n", 1, s + 1);
            for(int i=1;i<=(s+1)/2;i++)       
             printf("X.");
             if(s%2==0)
             printf("X");
            printf("\n");
        }
        else
        {
            for (int i = 1; i <= 25; i ++)
                for (int j = 1; j <= 25; j ++)
                   c[i][j] = false;
            int a, b;
            for (a = s / 8; (s - a * 8) % 3 != 0; a --) ;
            b = (s - a * 8) / 3;
            for (int i = 1; a && i * 2 < 25; i ++)
                for (int j = 1; a && j * 2 < 25; j ++, a --)
                    c[i * 2][j * 2] = true;
            for (int i = 0; i < b; i ++)
               c[25][25 - i] = true;
            printf("%d %d\n", 25, 25);
            for (int i = 1; i <= 25; i ++)
            {
                for (int j = 1; j <= 25; j ++)
                    if(c[i][j]==true)
                         printf("X");
                     else
                        printf(".");
                printf("\n");
            }
        }
    }
    return 0;
}

Task Scheduler
图片说明
根据这个公式。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5000+10;
int n,m,k;
struct node{
    int i,w;
}a[maxn];
bool cmp(node a,node b){
    if (a.w==b.w)return a.i<b.i;
    return a.w>b.w;
}
int main(){
    int t,x,y,s;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&m,&k);
        for (int i=1;i<=n;i++){
            scanf("%d",&a[i].w);
            a[i].i=i;
        }
        if (k==0){
            for (int i=1;i<=n;i++){
                if (i!=1)printf(" ");
                printf("%d",i);
            }
         printf("\n");
            continue;
        }
        sort(a+1,a+1+n,cmp);
        for (int i=1;i<=n;i++){
            if (i!=1)printf(" ");
            printf("%d",a[i].i);
        }
     printf("\n");
    }
    return 0;
}