Codeforces Round #299

原创 2015年11月21日 16:00:52

 A题 简单的模拟。给出一个数,输出它的英文名就好,注意零。

#include
#include

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    if(n==0||n==1||n==2||n==3||n==4||n==5||n==6||n==7||n==8||n==9||n==10||n==11||n==12||n==13||n==14||n==15||n==16||n==17||n==18||n==19||n==20||n==30||n==40||n==50||n==60||n==70||n==80||n==90)
  {
    switch(n)
    {
        case 0:printf("zero\n");break;
        case 1:printf("one\n");break;
        case 2:printf("two\n");break;
        case 3:printf("three\n");break;
        case 4:printf("four\n");break;
        case 5:printf("five\n");break;
        case 6:printf("six\n");break;
        case 7:printf("seven\n");break;
        case 8:printf("eight\n");break;
        case 9:printf("nine\n");break;
        case 10:printf("ten\n");break;
        case 11:printf("eleven\n");break;
        case 12:printf("twelve\n");break;
        case 13:printf("thirteen\n");break;
        case 14:printf("fourteen\n");break;
        case 15:printf("fifteen\n");break;
        case 16:printf("sixteen\n");break;
        case 17:printf("seventeen\n");break;
        case 18:printf("eighteen\n");break;
        case 19:printf("nineteen\n");break;
        case 20:printf("twenty\n");break;
        case 30:printf("thirty\n");break;
        case 40:printf("forty\n");break;
        case 50:printf("fifty\n");break;
        case 60:printf("sixty\n");break;
        case 70:printf("seventy\n");break;
        case 80:printf("eighty\n");break;
        case 90:printf("ninety\n");break;
    }
  }
  else
  {
      string str,s1,s2;
      if(n%10==1) s2="one";
      if(n%10==2) s2="two";
      if(n%10==3) s2="three";
      if(n%10==4) s2="four";
      if(n%10==5) s2="five";
      if(n%10==6) s2="six";
      if(n%10==7) s2="seven";
      if(n%10==8) s2="eight";
      if(n%10==9) s2="nine";
      if((n/10)%10==2) s1="twenty";
      if((n/10)%10==3) s1="thirty";
      if((n/10)%10==4) s1="forty";
      if((n/10)%10==5) s1="fifty";
      if((n/10)%10==6) s1="sixty";
      if((n/10)%10==7) s1="seventy";
      if((n/10)%10==8) s1="eighty";
      if((n/10)%10==9) s1="ninety";
      str=s1+"-"+s2;
      cout<
B题 数学题,是二进制法表示数这一类问题的变形。二进制表示数确实有很多优势,在计数上可以达到很大的值。在于领会二进制法的精髓吧,所以代码有时候作为语言的能力甚至超过了言辞。
#include
#include
#include

using namespace std;

int main()
{
    string str;
    cin>>str;
    int len=str.length();
    int m=atoi(str.c_str());
    int tmp=1;
    int ans=0;
    while(m)
    {
        if(m%10==4)
            ans+=1*tmp;
        else if(m%10==7)
            ans+=2*tmp;
        tmp=tmp*2;
        m/=10;
    }
    printf("%d\n",ans);
}
C题  分治题,用二分法解。读题是一个艰难的过程。给出一等差数列si=A+(i-1)*B;n次询问,每次询问给出l,t,m。题目要求,取数列中l开始的m个数,每次对每个数减一,减t次,到零就停止,求为零的最右边的数的下标是多少。
   二分就是要找到二分的区间以及二分结束的判断条件。显然可以得到最右端的数是lr=(t-a)/b+1,最左端的数是ll=l。且只要sl+(sl+1)+(sl+2)+...+(smid)<=t*m;就可以将二分区间向右移动,否则向左。需要注意的是longlong ==
#include
#include

using namespace std;
typedef long long ll;
ll a,b,n;
ll l,t,m;
ll sum(ll r)
{
    return (2*a+(l+r-2)*b)*(r-l+1)/2;

}
int main()
{
    scanf("%I64d%I64d%I64d",&a,&b,&n);
    while(n--)
    {
        scanf("%I64d%I64d%I64d",&l,&t,&m);
        ll sl=a+(l-1)*b;
        if(sl>t)
        {
            printf("-1\n");
            continue;
        }
        else
        {
            ll ll=l,lr=(t-a)/b+1,mid;
            while(ll<=lr)
            {
                mid=(ll+lr)/2;
                if(sum(mid)<=t*m) ll=mid+1;
                else lr=mid-1;
            }
          printf("%I64d\n",ll-1);
        }
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #299 (Div. 2)——C. Tavas and Karafs

快被二分搞死了。。。听一个大神说最好选择一种适合自己的写法然后搞懂它。 一开始用昨天那种写法,发现姿势不对,于是跑去又重新搞了一遍二分写法的区别。 题意: 现在告诉你每个点i的高度的求法是si=A+B...
  • ACMer_hades
  • ACMer_hades
  • 2015年10月02日 23:50
  • 304

Codeforces Round #299 (Div. 2) C. Tavas and Karafs

【题意】这题看了好久好久!其实就是个二分水题! 首先给出a,b,n 这是一个由a开头,b为公差,长度无限的等差数列 然后n个询问 输入l,t,m 取这个数列从l开始,m个数,每一次这个数...
  • just_sort
  • just_sort
  • 2016年05月09日 21:02
  • 204

Codeforces Round #299 (Div. 2) C. Tavas and Karafs 二分搜索+数列

题意:每个萝卜长度为 hi = a + (i - 1) * b,然后每次询问是每次操作最多把 m 个不同的未吃完的萝卜每个咬掉1单位长度,最多 t 次操作,其中求最大的r,是的[l......r]访问...
  • ProLightsfxjh
  • ProLightsfxjh
  • 2016年11月21日 23:54
  • 442

Educational Codeforces Round 27

A 题意:把2 * n个人分成两组,使得无论两组的人怎么进行比赛 第一组的人始终都要保持全赢,如果两个人能力值相等两人都可以赢 思路:排序后只要保证n + 1个人的能力值大于第n个人的能力值即可 #i...
  • sasuke__
  • sasuke__
  • 2017年08月23日 10:35
  • 198

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include ...
  • rowanhaoa
  • rowanhaoa
  • 2014年07月25日 14:39
  • 1471

Codeforces Round #299 (DIV.2)

A - Inna and Alarm Clock         坐标系上有很多闹钟,现在要关掉闹钟,首先选一个方向(横或纵),然后每次只能按这个方向关掉闹钟,问关掉所有闹钟的最小次数……直接...
  • qian99
  • qian99
  • 2014年02月12日 12:03
  • 533

Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforc...
  • qq_34731703
  • qq_34731703
  • 2017年02月03日 12:50
  • 488

Codeforces Round #374 (Div. 2) 终场翻盘记

讲道理这场cf本来是不想打的,因为感觉时间有点晚(主要还是国庆作业爆表了)。。后来不知道为什么还是决定打了。        开场前发现注册人数又8000+,(为什么我一打比赛就8000+啊)     ...
  • lych_cys
  • lych_cys
  • 2016年10月01日 09:48
  • 731

【解题报告】Codeforces Round #401 (Div. 2)

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017年02月25日 17:55
  • 410

Codeforces Round #460 (Div. 2)题目题解

A.Supermarket (水题) #include #include #include #include #include using namespace std; int mai...
  • wyxeainn
  • wyxeainn
  • 2018年01月31日 23:17
  • 73
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #299
举报原因:
原因补充:

(最多只允许输入30个字)