作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int a[7],f[N];
int v[N],c[N];
int main(){
	int T = 0;
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){
		++T;
		int sum = a[1]*1+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6;
		if(sum==0)break;
		if(sum%2!=0){
			printf("Collection #%d:\n",T);
			cout<<"Can't be divided."<<endl<<endl;
			continue;
		}
		int cnt = 0;
		for(int i=1;i<=6;i++){
			for(int j=1;j<=a[i];j<<=1){
				v[++cnt] = j*i;
				c[cnt] = j*i;
				a[i]-=j;
			}
			if(a[i]){
				v[++cnt] = a[i]*i;
				c[cnt] = a[i]*i;
			}
		}
		memset(f,0,sizeof(f));
		for(int i=1;i<=cnt;i++){
			for(int j=sum/2;j>=v[i];j--){
				f[j] = max(f[j],f[j-v[i]]+c[i]);
			}
		}
		if(f[sum/2]==sum/2){
			printf("Collection #%d:\n",T);
			cout<<"Can be divided."<<endl<<endl;
			continue;
		}
		else{
			printf("Collection #%d:\n",T);
			cout<<"Can't be divided."<<endl<<endl;
			continue;
		}
	}
	return 0;
}
/*
f[i][j]将i拆成j个平方的和的方法总数
f[i][j] = f[i-k*k][j-1]+1
*/
#include <bits/stdc++.h>
using namespace std;
int T;
int n;
int f[50000][10];
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		memset(f,0,sizeof(f));
		f[0][0] = 1;
		for(int k=1;k*k<=n;k++){
			for(int j=1;j<=4;j++){
				for(int i=1;i<=n;i++){
					if(k*k>i)continue;
					f[i][j] += f[i-k*k][j-1];
				}
			}
		}
		int res = 0;
		for(int i=1;i<=4;i++){
			res+=f[n][i];
		}
		cout<<res<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n,H,f[N],d[N],t[N];
int dp[N][N];
int main(){
	
	cin>>n>>H;
	H*=60;
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
	for(int i=1;i<=n;i++){
		cin>>d[i];
	}
	for(int i=1;i<n;i++){
		cin>>t[i];
	}
	memset(dp,0xcf,sizeof(dp));
	memset(dp[0],0,sizeof(dp[0]));
	int res = 0;
	for(int i=1;i<=n;i++){
		for(int j=H;j>=5*t[i-1];j--){
			dp[i][j] = dp[i-1][j-5*t[i-1]];
			for(int c=1;c<=(j-5*t[i-1])/5;c++){
				dp[i][j] = max(dp[i][j],dp[i-1][j-5*t[i-1]-5*c]+c*f[i]-c*(c-1)/2*d[i]);
			}
			res = max(res,dp[i][j]);
		}
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5+5;
#define int long long
int n,L,R;
int f[N],a[N];
int q[N],tail=-1,head=0;
signed main(){
	cin>>n>>L>>R;
	for(int i=0;i<=n;i++){
		cin>>a[i];
	}
	q[++tail] = 0;
	int res = -1e18;
	memset(f,0xcf,sizeof(f));
	f[0] = 0;
	for(int i=L;i<=n+R;i++){
		while(tail>=head && f[i-L]>=f[q[tail]])--tail;
		q[++tail] = i-L;
		while(tail>=head && q[head]<i-R)head++;
		int j = q[head];
		f[i] = f[j]+a[i];
		if(i>=n)res = max(res,f[i]);
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int f[N][N];
int n,m,p[N][3];
int check(int x){
	memset(f,0,sizeof(f));
	f[0][0] = 1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			for(int k=j;k>=0;k--){
				int tot = x-(j-k)*p[i][1];
				if(tot<0)continue;
				tot = tot/p[i][2];
				if(f[i-1][k]>0)
					f[i][j] = max(f[i][j],f[i-1][k]+tot);
			}
		}
	}
	return f[n][m]>=m+1;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>p[i][1]>>p[i][2];
	}
	int l=1,r=20000,res=-1;
	while(l<=r){
		int mid = (l+r)>>1;
		if(check(mid)){
			r = mid-1;
			res = mid;
		}
		else l = mid+1;
	}
	cout<<res<<endl;
	return 0;
}
状态
已结束
题目
39
开始时间
2026-4-24 0:00
截止时间
2026-5-2 23:59
可延期
24 小时