2020 Multi-University Training Contest 10
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; }