列表

详情


NC14716. 兼职数靶

描述

    饿了很久的XzzF终于忍不住了,出去找了一份兼职。他来到一个射击训练营,他的工作呢,就是数那些运动员打的靶子,然后把运动员的数据报给主教练,方便主教练选出优秀的运动员出去参加比赛。
    数靶这个活儿吧!显然是计件的,简单来说就是数的多,报酬就越高。XzzF想写个程序来做数靶这件事,不仅快,而且报酬高,岂不很nice!
    靶子可以看做是一个13*13的矩阵,相应的环数对应矩阵里的某些区域,如下图所示:
                            
                        1 1 1 1 1 1 1 1 1 1 1 1 1
                        1 2 2 2 2 2 2 2 2 2 2 2 1
                        1 2 2 2 2 2 2 2 2 2 2 2 1
                        1 2 2 3 3 3 3 3 3 3 2 2 1
                        1 2 2 3 3 3 3 3 3 3 2 2 1
                        1 2 2 3 3 4 4 4 3 3 2 2 1
                        1 2 2 3 3 4 4 4 3 3 2 2 1
                        1 2 2 3 3 4 4 4 3 3 2 2 1
                        1 2 2 3 3 3 3 3 3 3 2 2 1
                        1 2 2 3 3 3 3 3 3 3 2 2 1
                        1 2 2 2 2 2 2 2 2 2 2 2 1 
                        1 2 2 2 2 2 2 2 2 2 2 2 1
                        1 1 1 1 1 1 1 1 1 1 1 1 1

    而运动员所打的靶,则看做一个13 * 13的且只包含 '.' 和 '#' 字符矩阵,'#'表示被击中,而 '.' 则表示没被击中。
    现在XzzF知道运动员射击的次数N,以及射击后的靶子。(详情可见样例)主教练想知道运动员的平均射击环数(保留两位小数)。
    然而XzzF已经饿到大脑不能正常工作了,所以,请你完成这个数靶程序。

输入描述

第一行一个整数N(1 <= N <= 169),表示射击的次数,接着输入一个13 * 13的字符矩阵,里面只包含 '.' 和 '#','#'表示被击中,而 '.' 则表示没被击中。(保证'#'恰好有N个)
多组输入,N=0表示输入结束。

输出描述

该运动员的平均射击环数(保留两位小数)。

示例1

输入:

2
.............
.............
.............
.............
.............
.............
......#......
...#.........
.............
.............
.............
.............
.............
0

输出:

3.50

说明:

射中3环一次,4环一次,平均值为3.50。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 484K, 提交时间: 2018-12-23 14:26:28

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
const int mod = 1000000007;


int main(){
	int N;
	while(scanf("%d",&N) && N){

		double ans = 0;
		char c;
		int n;
		int score;
		for(int i = 1;i <= 13 ; i++){
			for(int j = 1; j <= 13 ; j++){
				scanf(" %c",&c);
				if(c == '#'){
					n = max(abs(7-i),abs(7-j));
					score = 4 - n / 2;
					ans += 1.0 * score;
				}
			}
		}
		printf("%.2lf\n",ans/N);
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2017-12-30 13:13:33

#include<bits/stdc++.h>
using namespace std;
int main(){
	const int d[]={1,1,2,2,3,3,4,4};
	int n;
	while(cin>>n&&n){
	int ans=0;
	for (int i=1;i<=13;i++)
		for (int j=1;j<=13;j++){
			char c;cin>>c;
			if (c=='#')ans+=d[min(min(i,j),min(14-i,14-j))];
		}
	printf("%.2f\n",(double)ans/n);
	}
}

上一题