BSOJ1134【数论】大学职员

##题目描述
在某些岛屿上有一个奇特的风俗,岛上的居民要么只说真话,要么只说假话。在岛上有一所有很多岛上的居民工作的工业大学。大学里面的所有人不论你问谁他们都会且只会给你说下面两个事实:
1.这里有不到 N N 个职员做的工作比我多。
2.这里有至少 M M 个职员得到的工资比我高。
可以知道的事实还有,没有任意两个职员有同样的工资。并且没有任意两个职员都做相同的工作量。下面请你帮忙计算这个大学里面一共有多少个职员。
##输入输出格式
输入格式
输入文件包含两个整数, N N M M ,意义如题目描述。
输出格式
输出文件包含一个整数,为这个大学的职员数。
##输入输出样例
输入样例

1 1

输出样例

2

##说明
对于 40 % 40\% 的数据, N , M 20 N,M\leq 20
对于 100 % 100\% 的数据, N , M 2000000000 N,M\leq 2000000000


##分析+证明
这个题真的就是一个 a + b a+b p r o b l e m problem ,具体证明如下:
1.由题意知:显然, 1 + 1 = 2 1+1=2 ,证毕。
2.上面那个是假的不要信 Q w Q QwQ
3.真の证明:题目说居民可以全说真话,也可以全说假话。我们不妨设总人数为 t o t a l total
①已知每个人都说有不到 N N 个人做的工作比自己多,且全说真话,这个毫无悬念 N = t o t a l N=total
②已知每个人都说有至少 M M 个人的工资比自己高,且全说真话,这个也是毫无悬念 M = 0 M=0 (因为工资最高的那个人肯定只能说有0个人的工资比他高啊)。
③但是!居民可以说谎啊!
(1)所以如果工资最高的人说谎,显然 M > 0 M>0 ,那么此时做的工作比工资最高的人还要多的人的人数 n u m 1 num1 就会 N ≥N 。但是又因为 t o t a l N total≥N ,且 n u m 1 < t o t a l num1<total ,所以 t o t a l 1 n u m 1 N total-1≥num1≥N。 设有 k k 人说谎,如果 k k 人中处在边界情况(例如此时 M = 1 M=1 ,工资第二高的人说谎,那么 M = 2 M=2 )的人有 p p ( p > = 1 ) (p>=1) ,那么 M = p , N = t o t a l p M=p,N=total-p ,所以 M + N = t o t a l k + k = t o t a l M+N=total-k+k=total 。并且我们貌似证出了一个玄学的结论:“工资最高的人做的事情最少”。(此结论欢迎提出意见)
(2)如果工资最高的人没有说谎,那么 M = 0 M=0 ,因为没有人影响边界,且根据结论"工资最高的人做的事情最少",所以 N = t o t a l N=total ,那么 N + M = t o t a l N+M=total
证毕!


蛤?这种题还要贴代码?行吧!
PS:long long警告。
PS:神仙代码警告!

#include<bits/stdc++.h>
using namespace std;
#define __ long long
#define _____ cin 
#define ______ >>
#define ______________ <<
#define ___ cout 
#define ________ ,
#define ________________ +
#define _______________________ return
#define _______________________________ ;
int main() 
{
	__ ____ ________ __________ _______________________________
	_____ ______ ____ ______ __________ _______________________________
	___ ______________ ____ ________________ __________ _______________________________
	_______________________ 0 _______________________________
}

猜你喜欢

转载自blog.csdn.net/disangan233/article/details/81126961
今日推荐