题目链接:http://codeforces.com/problemset/problem/451/C

题目意思:有3支球队(假设编号为1、2、3),总共要打 n 场比赛,已知已经错过这n场比赛中的 k 场,但从 k 场比赛中可以获取一些信息:设w1表示 k 场比赛中编号为1的球队赢了w1场比赛(w2、w3 类似),绝对值 |w1-w2| = d1,  |w2-w3| = d2,问能否通过设置n-k 的 赛果来使得n场比赛都打完后,编号为1的球队的胜利次数 == 编号为2的球队的胜利次数  == 编号为3的球队的胜利次数。注意:每场比赛的赛果只有胜和输之分,没有平局。

初时看到这道题目,完全没有思路,当看了Tutorial 之后(不过没仔细看他的solution),就大概知道怎么做了,贡献了两个wa......

首先对于n,如果不能被 3 整除,那就肯定怎么分配剩下的 n-k 场赛果都于事无补的了,因为最终 编号为1的球队的胜利次数 == 编号为2的球队的胜利次数  == 编号为3的球队的胜利次数 == n / 3 嘛

  其次,要得出一条隐含的方程(关键所在): w1 + w2 + w3 = k!  (1)

然后结合 |w1-w2| = d1 (2),  |w2-w3| = d2 (3) 来得出w1、 w2、 w3的值。(绝对值可以通过w1,w2,w3的大小关系来去掉,有四种情况)

(1)w1 >= w2,w2 >= w3                                      (2)w1 >= w2,w2 < w3

——>  w1 = (2d1 + d2 + k)  / 3              ——>  w1 = (2d1 - d2 + k)  / 3

w2 = (-d1 + d2 + k)  / 3                  w2  = (-d1 - d2 + k)  / 3

w3 = (-d1 - 2d2 + k) / 3                  w3  = (-d1 + 2d2 + k)  / 3

(3)w1 < w2,w2 >= w3                                          (4)w1 < w2,w2 < w3

——>  w1 = (-2d1 + d2 + k)  / 3                ——>  w1 = (-2d1 - d2 + k)  / 3

    w2 = ( d1   + d2 + k )  / 3                  w2 = ( d1   - d2 + k )  / 3

    w3 = ( d1   - 2d2 + k)  / 3                  w3 = ( d1  + 2d2 + k)  / 3

可以知道,x1与x2的大小关系只会影响 d1 的符号,x2与x3的大小关系只会影响 d2 的符号。

那么可以枚举d1与d2的符号(当然不可能是0啦),算出相应的x1, x2, x3 的大小,看看每个xi (1 <= i <= 3 ) 是否满足 0 <= xi <= n/3 (前提是n%3 == 0!下界0一定要加上,因为算出来有可能是负数啊),还有一点就是,由于涉及除法,4 / 3 == 1 这些情况要考虑到,一个可以避免的方法是,计算的时候,分子要判断是否能被3整除,不能就continue 咯。

总的来说,这题是纯数学题!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6
 7 __int64 n, k, d1, d2;
 8
 9 int main()
10 {
11     int t;
12     while (scanf("%d", &t) != EOF)
13     {
14         while (t--)
15         {
16             scanf("%I64d%I64d%I64d%I64d", &n, &k, &d1, &d2);
17             if (n % 3)
18                 printf("no\n");
19             else
20             {
21                 int flag = 0;
22                 for (int s1 = -1; s1 <= 1 && !flag; s1++)  // 控制d1的正负号
23                 {
24                     for (int s2 = -1; s2 <= 1 && !flag; s2++)  // 控制d2的正负号
25                     {
26                         if (s1 == 0 || s2 == 0)
27                             continue;
28                         __int64 w1, w2, w3;
29                         __int64 f1, f2, f3;  // w1, w2, w3的分子
30                         f1 = (2*(s1)*d1 + (s2)*d2 + k);
31                         if (f1 % 3)
32                             continue;
33                         w1 = f1 / 3;
34                         f2 = ((-1)*(s1)*d1 + (s2)*d2 + k);
35                         if (f2 % 3)
36                             continue;
37                         w2 = f2 / 3;
38                         f3 = ((-1)*(s1)*d1 + 2*(-1)*(s2)*d2 + k);
39                         if (f3 % 3)
40                             continue;
41                         w3 = f3 / 3;
42
43                         if (w1 + w2 + w3 == k && w1 >= 0 && w1 <= n/3 && w2 >= 0 && w2 <= n/3 && w3 >= 0 && w3 <= n/3)
44                         {
45                             flag = 1;
46                             break;
47                         }
48                     }
49                 }
50                 printf("%s\n", flag ? "yes" : "no");
51             }
52         }
53     }
54     return 0;
55 }

转载于:https://www.cnblogs.com/windysai/p/3870749.html

codeforces 451C. Predict Outcome of the Game 解题报告相关推荐

  1. Codeforces Round #700 (Div. 2)A~D2解题报告

    Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...

  2. Codeforces Round #693 (Div. 3)A~G解题报告

    Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...

  3. Codeforces Round #697 (Div. 3)A~G解题报告

    Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...

  4. Codeforces Round #827 (Div. 4) G. Orray 解题报告

    原题链接: Problem - G - Codeforces 题目描述: You are given an array aa consisting of nn nonnegative integers ...

  5. codeforces 814B.An express train to reveries 解题报告

    题目链接:http://codeforces.com/problemset/problem/814/B 题目意思:分别给定一个长度为 n 的不相同序列 a 和 b.这两个序列至少有 i 个位置(1 ≤ ...

  6. Codeforces Round #830 (Div. 2) B. Ugu 解题报告

    原题链接: Problem - B - Codeforces 题目描述: A binary string is a string consisting only of the characters 0 ...

  7. Codeforces Round #626(Div.2) 解题报告

    Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) [前言] 最近沉迷只狼,好久没有打CF了,水平 ...

  8. codeforces C. Inna and Huge Candy Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/400/C 题目意思:给出一个n行m列的矩阵,问经过 x 次clockwise,y 次 horizontal ...

  9. Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)

    做这样的比赛既考快速编码的能力,还有快速思维的能力.本人很弱,跌了rating..加油!!!.. 第一题上来就把题意理解错了..粗心啊..直接模拟着做就行:1:如果字符串全是大写字母就进行大小写转换: ...

最新文章

  1. java 枚举 循环_java – 在枚举中实现内部接口时的循环继承
  2. 带有128KB缓存的AD7606模拟采集板
  3. ARC中block块作为属性的使用笔记
  4. Redis张工的set存储结构(实现)原理
  5. 局域网聊天9月局域网聊天
  6. 2018安卓应用安全白皮书:超98%安卓应用存有安全风险
  7. python自学入门-初学 Python 者自学 Anaconda 的正确姿势是什么?
  8. 快!100小时免费GPU跑起来!低价又好用的深度学习宝藏平台!
  9. Java:单例模式的七种写法 (转)
  10. 修改redis配置文件,并以指定配置文件的方式启动
  11. 基于vue的个人博客
  12. Factory method 'dataSource' threw exception; nested exception is java.lang.NullPointerException
  13. java redis 通知_Jboot实现Redis操作事件通知
  14. 2018计算机通信网络,2018年1-12月我国计算机、通信和其他电子设备制造业企业数量共计16656个...
  15. python算法1加1_【Python爬虫作业】- 第一周01 笨方法0-10加分题
  16. 学习Hadoop的前提条件
  17. 读书笔记—别让情绪毁了你(插图精读本)
  18. anaconda 创建虚拟环境(自己版本)
  19. 电脑重启后IDEA导包报错
  20. 保护眼睛,开启浏览器的夜间模式 顺便学下!important的作用

热门文章

  1. internal java compiler error_java字节码注入AOP作业心得
  2. 计算机模拟与生态工程,2018年环境生态工程专业分析及就业前景
  3. IIS安装2个SSL_SSL的申请与https使用
  4. pmos管的应用_串联稳压电路3:NMOS型、PMOS型
  5. 燃气管理 php,智能燃气管理信息系统设计
  6. 全国二级c语言考试题型,2016年电大 -全国计算机二级c语言考试题型及考试重点.doc...
  7. pythonpandas设置索引_pandas DataFrame的修改方法(值、列、索引)
  8. c#特性 java注解,Java注解全面了解
  9. c语言求最后一个单词的长度,试题2:计算字符串最后一个单词的长度
  10. java select 不是date,iPhonedateselect器,而不是键盘?