杭电OJ刷题

1003 Max Sum
1005 Number Sequence
1008 Elevator
1009 FatMouse’ Trade
1106 排序

1003

#include<iostream>
using namespace std;
#define LL long long
LL a[100001];
int main() {
    int n;
    cin>>n;
    for(int k=0;k<n;k++) {
        LL m,sum=0,max=-1001,start=0,end=0,flag=0;
        cin>>m;
        for(int i=0;i<m;i++) {
            cin>>a[i];
        }
        for(int i=0;i<m;i++) {
            sum += a[i];
            if(sum>max) {
                end = i;
                start = flag;
                max = sum;
            }
            if(sum<0) {
                sum = 0;
                flag = i + 1;
            }
            
        }
        cout<<"Case "<<k+1<<":"<<endl;
        if(n-1==k) {
            cout<<max<<" "<<start+1<<" "<<end+1<<endl;
        } else {
            cout<<max<<" "<<start+1<<" "<<end+1<<endl<<endl;
        }
    }
    return 0;
}

1005

此题关键是找规律,否则,用递归会超内存,用for会超时。根据题意,fn = a*(fn-1)%7+b*(fn-2)%7,由此可知,fn可能的情况有7*7=49种,对于不同的a,b,开始循环的值不同,无论如何,都会在49轮后出现循环,所以只需将n%49即可。

#include<iostream>
using namespace std;
int fn(int a, int b, int n) {
	n = n % 49;
	if (n ==1 || n == 2) return 1;
	int sum1 = 1, sum2 = 1;
	for(int i=3; i<=n; i++) {
		int sum3 = (a * sum2 + b * sum1) % 7;
		sum1 = sum2;
		sum2 = sum3;
	}
	return sum2;
}
int main() {
	while (1) {
		int a, b, n;
		cin >> a >> b >> n;
		if (a == 0 && b == 0 && n == 0) break;
		cout << fn(a, b, n) << endl;
	}
	return 0;
}

1008

#include<iostream>
using namespace std;
int main() {
	int sum = 0;
	int n, pos = 0;
	while (cin >> n && n != 0) {
		sum = 0;
		pos = 0;
		for (int i = 0;i < n;i++) {
			int re;
			cin >> re;
			int f = re - pos;
			if (f > 0) {
				sum += f * 6;
				sum += 5;
			}
			else {
				sum += (-f) * 4;
				sum += 5;
			}
			pos = re;
		}
		cout << sum << endl;
	}
	return 0;
}

1009 FatMouse' Trade

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node {
	int j;
	int f;
	double per;
};
bool cmp(node x, node y) {
	if(x.per>y.per) return true;
	return false;
}
int main() {
	int m, n;
	while(cin>>m>>n) {
		struct node a[1001];
		double max = 0;
		if(m == -1 && n == -1) break;
		for(int i=0;i<n;i++) {
			cin>>a[i].j>>a[i].f;
			a[i].per = a[i].j*1.0/a[i].f;
		}
		sort(a, a+n, cmp);
		for(int i=0;i<n;i++) {
			if(m<=0) break;
			if(m>=a[i].f) {
				max += a[i].j;
				m -= a[i].f;
			} else {
				max += a[i].per * m;
				m -= a[i].f;
			}
		}
		printf("%.3f\n", max);
	}
	return 0;
}

排序

错误点:不能有连续的5

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int str_to_int(string s) {
	int sum = 0;
	for (int i = 0;i < s.length();i++) {
		sum = sum * 10 + (s[i]-'0');
	}
	return sum;
}
bool cmp(const int &a, const int &b) {
	return a < b;
}
int main() {
	string s;
	while (cin >> s) {
		vector<int> v;
		string portion = "";
		s = s + "5";
		for (int i = 0;i < s.length();i++) {
			if (portion == "" && s[i] == '5') {
				continue;
			}
			if (s[i] == '5') {
				v.push_back(str_to_int(portion));
				portion = "";
			}
			else {
				portion += s[i];
			}
		}
		sort(v.begin(), v.end(), cmp);
		for (int j = 0;j < v.size();j++) {
			if (j != v.size() - 1) {
				cout << v[j] << " ";
			}
			else {
				cout << v[j];
			}
		}
		cout << endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值