7.28考总

T4T4

分析可以知道,每一种颜色肯定的珍珠数量肯定不会超过n/2,所以以n/2作为分界点,让i与i+n/2去拼就肯定不会重复。

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n,m,ans[maxn],a[maxn];
signed main(){
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	int cnt=0;
	for(int i=1;i<=m;i++){
		cin>>a[i];
		while(a[i]--){
			ans[++cnt]=i;
		}
	}
	for(int i=1;i<=n/2;i++){
		cout<<ans[i]<<" "<<ans[i+n/2]<<endl;
	}
	return 0;
}

T5

用背包的思路去做,方程为:

dpi=max( dpi,dpj+sumij )dp_i=\max(\ dp_i,dp_j+sum_{i-j}\ )

sum实际上是一个前缀和数组,表示载i头奶牛过河的时间,但是还需要加上两个m,即来回一次的时间,最后减去一个m,因为最后一次不用划回去。

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=3e5+5;
int n,sum[maxn],a[maxn],dp[maxn];
signed main(){
	memset(dp,0x3f,sizeof(dp));
	cin>>n>>sum[0];
	dp[0]=0;
	sum[0]+=sum[0];
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<i;j++){
			dp[i]=min(dp[i],dp[j]+sum[i-j]);
		}
	}
	cout<<dp[n]-sum[0]/2<<endl;
	return 0;
}

T6

采用差分思想,因为需要的本来就是差分数组,先跑出一遍求出初始值。每次更改时只需要删去左端点与右端点+1的位置的影响,然后改变差分值,再加上影响即可。

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2e6+5;
int a[maxn],d[maxn],m,n,s,t,sum[maxn];
int cal(int x){
	return x>0?-s*x:-t*x;
}
signed main(){
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>s>>t;
	int ahah=0,haha;
	int ans=0;
	for(int i=0;i<=n;i++){
		cin>>haha;
		d[i]=haha-ahah;
		ahah=haha;
		ans+=cal(d[i]);
	}	
	while(m--){
		int x,y,z;
		cin>>x>>y>>z;
		ans-=cal(d[x]);
		d[x]+=z;
		ans+=cal(d[x]);
		if(y!=n){
			ans-=cal(d[y+1]);
			d[y+1]-=z;
			ans+=cal(d[y+1]);
		}
		cout<<ans<<endl;
	}
	return 0;
}
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示