NC14716. 兼职数靶
描述
输入描述
第一行一个整数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); } }