您的位置:首页 > 其它

Ural 1430. Crime and Punishment(数论)

2014-01-23 23:50 375 查看
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1430

题意: 求x,y使得ax + by <= n (x>=0, y>=0)且ax+by尽量大。

思路:

假设a > b,只需要暴力枚举x判断即可,上限top为min(n/a, b),复杂度是O(sqrt(n))的。

证明很简单,如果x > b则可以写成 a(x + b) + by = ax + ab + by = ax + b(a+y),这里的x < b,即这种情况肯定是枚举到了的,所以上限设为min(n/a, b)。

code:

#include
#include
#include
#include
using namespace std;

int main() {
int a, b, n, mx = 0, x = 0, y = 0;
cin>>a>>b>>n;
if(a > b) {
int top = min(n/a, b);
for(int i = 0;i <= top; i++) {
int cur = (n-a*i)/b*b + a*i;
if(cur > mx) {
mx = cur;x = i; y = (n-a*i)/b;
}
}
}
else {
int top = min(n/b, a);
for(int i = 0;i <= top; i++) {
int cur = (n-b*i)/a*a + b*i;
if(cur > mx) {
mx = cur;x = (n-b*i)/a; y = i;
}
}
}
cout<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: