首页 > 学院 > 开发设计 > 正文

Codeforces Round #397 - Problem C - Table Tennis Game 2

2019-11-08 19:48:33
字体:
来源:转载
供稿:网友

题目链接:http://codeforces.com/contest/765/PRoblem/C

题意:两人打乒乓球,赢一球加1分,若其中一人分数达到上限则开始新的一局,给出每局分数上限k,两人得分a,b,求最大局数,若情形不存在输出-1。 关键:易漏判输出-1的情况。

依题意,a=kn1+xb=kn2+y,其中n1,n2≥0,且n1+n2>00≤x,y≤k−1。 则在给定的k,a,b下,x越小,n1越大,n2同理。

猜想:若情况存在,则ans=a/k+b/k 证明:构造法,构造一个可行的解来证明

a:b可以拆成 ⎧⎩⎨⎪⎪⎪⎪k:yk:0x:k0:k1个n1−1个1个n2−1个 即,当y≠0时,n1必须大于0,这样才可以构成一个k:y。同理,当x≠0时,n2必须大于0。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define FOR(i,k,n) for(int i=k;i<n;i++)#define FORR(i,k,n) for(int i=k;i<=n;i++)#define scan(a) scanf("%d",&a)#define scann(a,b) scanf("%d%d",&a,&b)#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)#define mst(a,n) memset(a,n,sizeof(a))#define ll long long#define N 1005#define mod 1000000007#define INF 0x3f3f3f3fconst double eps=1e-8;const double pi=acos(-1.0);int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); ll k,a,b; cin>>k>>a>>b; ll ans1=a/k; ll ans2=b/k; int flag=0; if(b%k && ans1==0) flag=1; if(a%k && ans2==0) flag=1; if(flag) cout<<"-1"<<endl; else cout<<ans1+ans2<<endl; return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表