2019.03.16【NOIP提高组】模拟 B 组

2019.03.16【NOIP提高组】模拟 B 组

  • 电费结算(electric)
    • Description
    • Input
    • Output
    • 个人看法
  • 序列和(sum)
    • Description
    • Input
    • Output
    • 个人看法(未完工)

今天心情一片大崩……
十分不在状态(好饿啊……)
好吧,言归正传

  • 电费结算(electric)
  • 序列和(sum)
  • 最多的约数(divisor)

目前已AK
下面是以下的总结

电费结算(electric)

Description

WZK最近靠租房发家致富了。作为WZK老同学的你也要租房,于是WZK决定不要房租,但是电费还得付。以下是用电价格:
在这里插入图片描述

举个例子吧。如果你用电为10123千瓦时,那么要付2 * 100 + 3 * 9900 + 5 * 123 = 30515块钱(好贵)。
到结算电费的日子了,可是WZK家里只有一个总电表,也就是统计你和WZK总共用的电量。但是WZK有办法告诉你以下信息:
1).如果按照总电表来看要交给供电局的钱A。(也就是两个人用电量加起来一起算钱)
2).你和WZK如果分开付的话,你们付的钱的差值B。
现在你想知道如果你单独算钱的话,需要付多少钱。当然,你的用电量不会比WZK多。

举个例子:如果你们一起算钱要付1100,并且如果分开来算,你们的差值是300的话,那么你用了150kwh,WZK用了250kwh。让我们来验算一下:你们一共用电400kwh,所以要付2 * 100 + 3 * 300 = 1100,你单独要付2 * 100 + 3 * 50 = 350,WZK单独要付2 * 100 + 3 * 150 = 650。所以最后,你只需要告诉我你单独要付350元。

Input

输入仅一行,包含两个整数A和B(1 ≤ A, B ≤ 1 0 19 10^{19} 1019),含义同上。 输出描述: 输出仅一行一个整数,代表你单独算需要付的钱。数据保证解唯一。

Output

输出仅一行一个整数,代表你单独算需要付的钱。数据保证解唯一。

个人看法

这道题刚拿到手的时候,第一感觉就是把A解出来。应该很自然吧。
用一大堆的判断就完事了
然后,我们一看, 1 0 19 10^{19} 1019,会炸!
(旁边某大佬:请不要在这一本正经胡说八道)
那我们想想,A转化成电量后,是不会这么庞大的,所以我们可以想到O( l o g N log_{N} logN)级别的二分
所以,这道题就迎刃而解了。

#include 
using namespace std;
int a,b,all,need,x,mid,l,r,he;
int main()
{
	scanf("%d%d",&a,&b);
	if (a>200)
	{
		a-=200; all+=100;
	}else all+=a/2,a=0;
	if (a>29700)
	{
		a-=29700;all+=9900;
	}else all+=a/3,a=0;
	if (a>4950000)
	{
		a-=4950000; all+=990000;
	}else all+=a/5,a=0;
	all+=a/7;
	l=1;r=all;
	while (l<=r)
	{
		mid=(l+r)/2;
		x=mid;
		need=0;
		if (x>100) x-=100,need+=200;else need+=2*x,x=0;
		if (x>9900) x-=9900,need+=29700;else need+=3*x,x=0;
		if (x>990000) x-=990000,need+=4950000;else need+=5*x,x=0;
		need+=7*x;
		he=0;
		x=all-mid;
		if (x>100) x-=100,he+=200;else he+=2*x,x=0;
		if (x>9900) x-=9900,he+=29700;else he+=3*x,x=0;
		if (x>990000) x-=990000,he+=4950000;else he+=5*x,x=0;
		he+=7*x;
		if (he-need==b) 
		{
			printf("%d",need);
			return 0;
		}else 
			if (he-need>b) l=mid;else r=mid;
	}
}



序列和(sum)

Description

N个数排成一个环,请选出不超过K段的连续的数,段与段间不能重叠,且
使得选出的数和最大。

Input

输入文件sum.in第一行包含两个正整数N和k。
接下来1行描述这N个数。

Output

输出文件sum.out包含一个数,即要去的最大的和。

个人看法(未完工)

这道题有点小迷
设f[i][j][0…1]为这个点

你可能感兴趣的:(总结,比赛总结)