第九届ECNU Coder A.足球锦标赛
题目链接:http://acm.ecnu.edu.cn/contest/16/problem/A/
题目:
A. 足球锦标赛
Time limit per test: 2.0 seconds
Time limit all tests: 2.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 130 / 496
ECNU 足球锦标赛采用了最传统的计分牌来计分。每进一个球,计分员给对应的队要翻牌,使得计分板上显示的数加一。
如上图所示,计分板上的每一位都按顺序挂了 0 到 9 这 10 个牌子,所以可以表示 000 至 999。当其中一个队的得分从 010 变成 011 时,计分员只要将最后一位的最前面的牌子向后翻即可,共需翻动一块牌子;当得分从 019 变成 020 是,由于 9 后面已经没有牌子了,所以计分员要将 0 到 9 全部翻到前面,并将倒数第二位的牌子 1 翻到后面,所以共需翻动 10 块牌子。
现场的计分牌和图中所示还是存在差异的,现场的计分牌会很大,很重,所以翻每块牌子都要消耗 1 点体力。
你是计分员,现在比赛还剩下最后十分钟。现在有一个预言家告诉你在这十分钟里,双方得分共计多少;但他没有告诉你双方得分各是多少。所以你想要知道你要花费的体力值最多是多少。
Input
第一行给出数据组数 T (1≤T≤1 000)。接下来对于每组数据有两行:
第一行是两个三位数 A,B (0≤A,B≤999)(含前导 0),形如 001,013,123,表示双方现在的得分。
第二行是一个整数 K (0≤K≤min{999−A,999−B}),表示双方在最后十分钟的得分之和。
Output
对于每组数据,输出 Case x: y
。其中 x 是从 1 开始的测试数据编号,y 是一个整数,表示花费体力最多是多少。
Examples
2 009 009 2 001 003 2
Case 1: 20 Case 2: 2
Note
样例 1 解释:有三种情况。
- 甲方(前者)得 2 分,乙方(后者)得 0 分;甲方要翻 10+1=11 次。
- 甲方和乙方各得 1 分,共要翻 10+10=20 次。
- 乙方得 2 分,同样翻 11 次。
所以最多要翻 20 次。
题解:
暴力枚举甲的得分 i,乙的得分为 K-i。
分别算甲的翻动和乙的翻动。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <string> 7 #include <vector> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <queue> 12 #include <sstream> 13 #include <algorithm> 14 using namespace std; 15 #define pb push_back 16 #define mp make_pair 17 #define ms(a, b) memset((a), (b), sizeof(a)) 18 #define eps 0.0000001 19 typedef long long LL; 20 typedef unsigned long long ULL; 21 const int inf = 0x3f3f3f3f; 22 const LL INF = 0x7fffffff; 23 const int maxn = 1e6+10; 24 const int mod = 1e9+7; 25 int kase = 1; 26 void init() { 27 28 } 29 int cnt(string s, int get) 30 { 31 int ans = 0; 32 while(get>0){ 33 while(s[2]<'9'&&get>0){ 34 s[2]++; 35 ans++; 36 get--; 37 } 38 if(s[2]=='9'&&get>0&&s[1]!='9'){ 39 ans+=10; 40 get--; 41 s[2] = '0'; 42 s[1]++; 43 } 44 else if(s[2]=='9'&&get>0&&s[1]=='9'){ 45 ans += 19; 46 get--; 47 s[2] = '0'; 48 s[1] = '0'; 49 s[0]++; 50 } 51 } 52 return ans; 53 } 54 void solve() { 55 int K; 56 string A, B; 57 cin >> A >> B >> K; 58 int ans = -inf; 59 for(int i = 0;i<=K;i++){ 60 int Aget = i; 61 int Bget = K-i; 62 ans = max(ans, cnt(A, Aget)+cnt(B, Bget) ); 63 } 64 cout << "Case " << kase++ << ": " << ans << endl; 65 } 66 int main() { 67 #ifdef LOCAL 68 freopen("input.txt", "r", stdin); 69 // freopen("output.txt", "w", stdout); 70 #endif // LOCAL 71 int T; 72 cin >> T; 73 while(T--){ 74 init(); 75 solve(); 76 } 77 return 0; 78 }
个人总结:
一开始以为是贪心。没有多想就去贪了。连wa几发,然后看了一下Note发现tips是暴力,就直接写了,有个地方忘记写get-- wa了几发,好亏。
你努力的时候,比你厉害的人也在努力。