7-6 促销收费(2008慈溪)

元旦快到了,各个商场都开始策划大规模的促销活动。慈溪国际购物中心计划推出“满300减120、满500减240”的活动,也就是顾客购买物品的总金额中每300元可以优惠120元,每500元优惠240元,上不封顶。为此,商场收费系统需要进行升级。请你帮助慈溪国际购物中心设计其中的一段程序,输入顾客购买物品的总金额后,即输出优惠后的付款总数。注意,一定要按最优惠的方法计算哦!
输入格式:

只有一行,是顾客购买各种物品的总金额N。(N保证为整数,且N≤2000000000)
输出格式:

只有一行,即优惠后的付款额。
输入样例:

310

输出样例:

190

签到题 分类讨论即可
很容易发现方案是单调的一次函数,
如果有600块钱当然选择第二种方案更优
很容易发现 嫩选方案二尽量选方案二,知道不能选了才看看能不能选方案一

#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>

#define MAXN ((int)1e5+7)
#define int long long int
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)

void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
#endif

#ifndef debug
namespace FIO {
	template <typename T>
	void read(T& x) {
		int f = 1; x = 0;
		char ch = getchar();

		while (ch < '0' || ch > '9') 
			{ if (ch == '-') f = -1; ch = getchar(); }
		while (ch >= '0' && ch <= '9') 
			{ x = x * 10 + ch - '0'; ch = getchar(); }
		x *= f;
	}
};
using namespace FIO;
#endif


int n, m, Q, K;


signed main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%lld ", &n);
#if 0
	for(int i=100000; i<=10000000; i++) {
		int tmax = 0, cntA = 0, cntB = 0;
		for(int k=0; k<=i/300; k++) {
			int A = k, B = (i-300*k) / 500;
			int tsum = 120 * A + 240 * B;
			if(tmax < tsum) {
				cntA = A, cntB = B;
				tmax = tsum;
			}
		}
		show(i, tmax, cntA, cntB);
	}
#else 
	int ans = 0, tmp = n;
	if(n < 300)
		printf("%lld\n", n);
	else if(n >= 300 && n < 500) {
		printf("%lld\n", n-120);
	} else {
		ans += n/500 * 240;
		n %= 500;
		if(n >= 300) ans += 120;
		printf("%lld\n", tmp-ans);
	}
#endif


#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}