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;
}


京公网安备 11010502036488号