Crime and Punishment
链接:http://acm.timus.ru/problem.aspx?space=1&num=1430

题目:

Background

Petty bureaucrat Victor Thiefton was disposed towards stealing from his childhood. But one thing is to legally privatize national factories, diamond fields and oil derricks at the cost of billions dollars. And another thing is to filch some money from a poor regional budget. Our legislation is very strict. Therefore Victor felt that justice is on the alert just after he extracted his hand from the national pocket. What should he do to escape inevitable punishment?
Mr. Thiefton has once heard that in accordance with the criminal legislation standards he would be condemned to long imprisonment for a theft whereas in case of a peculation he could escape with a suspended sentence only. So if the most part of stolen money is peculated, the duration of imprisonment will be reduced.

Problem

The same evening Mr. Thiefton burst into "MegaApril" superstore and rushed for overflowing storefronts carrying a purse with N stolen dollars. It appeared that unlimited number of high-quality goods and goods at moderate price were on sale in the superstore. High-quality goods cost A dollars per piece, and goods at moderate price cost B dollars per piece. Victor should spend as much stolen money as possible to reduce the duration of imprisonment to a minimum.


题意:数字abc,求n*a+m*b最大且n*a+m*b<=c的n和m(任意)

分析:数论内容(最大公约数最小公倍数),也可暴力求解

题解:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <functional>
#include <cmath>
#include <cctype>
#include <cfloat>
#include <climits>
#include <complex>
#include <deque>
#include <list>
#include <set>
#include <utility>
using namespace std;

int gcd(int a,int b)
{
	return (b)?gcd(b,a%b):a;
}

int main()
{
	int a,b,n,g,t,res,x,y;
	scanf("%d %d %d",&a,&b,&n);
	bool flag=false;
	if(a<b){
		swap(a,b);
		flag=true;
	}
	g=gcd(a,b);
	n/=g;
	a/=g;
	b/=g;
	t=n/a;
	res=n;
	x=y=0;
	for(int i=0;i<=t;++i){
		if(res>(n-i*a)%b){
			x=i;y=(n-i*a)/b;
			res=n-x*a-y*b;
			if(res==0)break;
		}
	}
	if(flag)
		printf("%d %d\n",y,x);
	else
		printf("%d %d\n",x,y);
	return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/veget_chicken/article/details/52346818
文章标签: gcd acm
个人分类: gcd
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Crime and Punishment

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭