1003:Mine Sweeper
AC代码
题意:
给出一个N代表扫雷的图里面所有数字的和为N,用“X”和“.”分别表示炸弹和空格。
思路:
XXX
X.X
XXX
一个这样的组合能提供一个8的贡献,只需要在25*25的“X”的矩阵里面全放这样的结构即可(.和X反过来同理)。
多出来的(最多7个)采用在矩阵里面挖出来即可。
如果 N ≤ 24,我们可以构造这样的地图:“.X.X.X···”,可知当长度为 l 的时候,数字和就等于 l−1。
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 50;
const int INF = 0x3f3f3f3f;
const double eps = 1e-11;
const ll mod = 1e9 + 7;
ll n ;
ll vis[maxn][maxn] ;
int main(){
T{
cin >> n ;
memset(vis,0,sizeof vis) ;
if(n < 25){
printf("1 %lld\n",n+1) ;
for(int i = 1; i <= n+1 ; i++){
if(i&1)
printf("X") ;
else printf(".") ;
}
printf("\n") ;
}
else{
double sum = n / 8 ;
int xlen = sum / 12 ;
int c = n % 8 ;
printf("25 25\n") ;
for(int i = 1 ; i <= xlen ; i++){
for(int j = 1 ; j <= 12 ; j++)
vis[i*2][j*2] = 1 ;
}
if(xlen * 12 < sum){
int y = sum - xlen * 12 ;
for(int i = 1 ; i <= y ; i++)
vis[xlen*2+2][2*i] = 1 ;
}
if(c == 1) vis[1][1] = 1 ;
else if(c== 2) vis[1][1] = vis[1][2] = 1 ;
else if(c == 3) vis[25][1] = 1 ;
else if(c == 4) vis[1][1] =vis[25][1] = 1 ;
else if(c == 5) vis[25][2] = 1 ;
else if(c == 6) vis[25][25] = vis[25][1] = 1 ;
else if(c == 7) vis[1][1] =vis[25][25] = vis[25][1] = 1 ;
for(int i = 1 ; i <= 25 ; i++){
for(int j = 1 ; j <= 25 ; j++){
if(vis[i][j])
printf(".") ;
else
printf("X") ;
}
printf("\n") ;
}
}
}
return 0 ;
}
1011:Task Scheduler
AC代码:
思路
这题只需要对输入进行下标排序即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct aaa{
int val;
int num;
};
bool cmp(aaa a,aaa b)
{
if(a.val!=b.val)
return a.val>b.val;
else
return a.num<b.num;
}
aaa a[10005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].num=i;
}
if(k!=0)
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i!=n)
printf("%d ",a[i].num);
else
printf("%d",a[i].num);
}
printf("\n");
}
return 0;
}