【HDU】2020杭电多校第十场解题报告(1003、1011)

1003:Mine Sweeper

AC代码

题意:

给出一个N代表扫雷的图里面所有数字的和为N,用“X”和“.”分别表示炸弹和空格。

思路:

XXX
X.X
XXX

一个这样的组合能提供一个8的贡献,只需要在25*25的“X”的矩阵里面全放这样的结构即可。
多出来的(最多7个)采用在矩阵里面挖出来即可。
如果 N ≤ 24,我们可以构造这样的地图:“.X.X.X···”,可知当长度为 l 的时候,数字和就等于 l−1。

#include 
#define rep(i,a,b) for(int i=a;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
#include
#include
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;
}

你可能感兴趣的:(杭电多校,题解)