算法加项目

发布于:2024-08-08 ⋅ 阅读:(146) ⋅ 点赞:(0)

1.仅加号

很简单,找到每次添加后最小的即可,这里不做演示。

2.采药

dp,for1数目,for2时间,简单的dp模板题目。

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=105,M=105;
long long a[M],b[M],dp[N][1005];
int main() {
    cin>>m>>n;
    for(int i=1; i<=n; i++)
        cin>>a[i]>>b[i];
    for(int i=1; i<=n; i++) {
        for(int j=m; j>=0; j--) {
            if(j>=a[i])
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]);
                else
                dp[i][j]=dp[i-1][j];
        }
    }
    printf("%lld",dp[n][m]);
    return 0;
}

3.奶牛晒衣服

二分,二分对象为时间,从最多的时间开始一直折半,直到while条件不成立,则可以得出结果!

#include<bits/stdc++.h>
using namespace std;
long long s[500005];
long long n,a,b;
long long l=0,r=0;
int pd(int x){
	int k=0;
	for(int i=1;i<=n;i++){
		if(s[i]-a*x<=0)continue;
		int e=s[i]-a*x;
		if(e%b!=0)
		k+=e/b+1;
		else
		k+=e/b;
	}
	if(k<=x) return 1;
    else return 0;
}
int main() {
	cin>>n>>a>>b;
	for(int i=1; i<=n; i++) {
		cin>>s[i];
		r=max(r,s[i]/a+1);
	}
	long long mid=r;
	while(l<r) {
		mid=(l+r)/2;  //时间
		if(pd(mid))
		r=mid;
		else
		l=mid+1;
	}
	cout<<r;

	return 0;
}

4.进击的奶牛

稍微比普通的二分模板题目难一点,将他们的距离进行二分,然后进行判断,如果pd函数成立,则继续查找比x更大的距离。

#include<bits/stdc++.h>
using namespace std;
long long s[500005];
long long n,a,b,m;
long long l=1,r=0;
int pd(int x){
	int k=1,y=s[1];
	for(int i=2;i<=n;i++){
         if(s[i]-y>=x)
         y=s[i],k++;
         else
         continue;
	}
//	cout<<k<<endl;
	if(k<m) return 0;
    else return 1;
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>s[i];
	}
	sort(s+1,s+1+n);
	r=s[n];
	long long mid;
	while(l+1<r) {
		mid=(l+r)/2;  //距离
		if(pd(mid))
			l=mid;
		else
			r=mid;

	//	cout<<l<<" "<<r<<" "<<mid<<endl;
	}
	cout<<l;

	return 0;
}

5.木材加工

也是模板二分,不用绕弯子。

6.最小餮食

找到数组A,满足条件的最小个数,在找到数组B,满足条件的最小个数,他们之间最小的必然同时满足两个条件。注意:x,y,t这里要用long long 因为为14次方,int满足不了。

#include<bits/stdc++.h>
using namespace std;
long long t,x,y;
int ans,n;
const int N=2e5+7;
int a[N],b[N];
bool cmp(int a, int b) {
	return a > b;
}
int main() {
	cin>>n>>x>>y;
	for(int i=1; i<=n; i++)
		cin>>a[i];
	for(int i=1; i<=n; i++)
		cin>>b[i];
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);
	ans=n;
	for(int i=1; i<=n; i++) {
		t+=a[i];
		if(t>x) {
			ans=i;
			break;
		}
	}
	t=0;
//	cout<<ans<<" "<<a[1]<<endl;
	for(int i=1; i<=n; i++) {
		t+=b[i];
		if(t>y) {
			ans=min(i,ans);
			break;
		}
		//cout<<ans<<" "<<t<<endl;
	}
	cout<<ans<<endl;
	return 0;
}

7.成功实现信息显示在List上

但是还没有实现将数据保存在数据库中,预计下次总结实现数据库存储及其他功能。

创建类ChatBubble,用来显示头像,气泡之类的,这里创建改类的对象,调用类中的方法,实现如下操作。

气泡设置及添加节点到对象中:

 //聊天气泡,本人为深绿色,非本人为浅绿色
      //  Rectangle bubble = new Rectangle(40.0, 20.0, (double) this.totalLength * 1.2, 30.0);xxx
        //矩形的宽度,矩形的高度,矩形四个角的弧度宽度,矩形四个角的弧度高度
        Rectangle bubble = new Rectangle(40.0, 20.0, (double) this.totalLength * 1, 30);
        bubble.setArcWidth(10.0);
        bubble.setArcHeight(10.0);
        bubble.setFill(isSentByMe ? Color.LIGHTGREEN : Color.LIGHTGRAY);//颜色
        //设置消息内容的文本布局
        TextFlow messageFlow = new TextFlow();
        messageFlow.setLayoutX(40.0);
        messageFlow.setLayoutY(28.0);
        messageFlow.setPrefWidth(100.0);
        messageFlow.setLineSpacing(5.0);
        this.processMessage(message, messageFlow, bubble);//2
        //将当前节点添加到对象中
        this.getChildren().addAll(new Node[]{head, label, label1, bubble, messageFlow});

效果如下:


网站公告

今日签到

点亮在社区的每一天
去签到