//https://img2018.cnblogs.com/blog/1646268/201908/1646268-20190806114008215-138720377.jpg

2023.4.22洛谷月赛解题报告

传送门

T1

一眼题,特判整除的情况输出 \(k\),然后其余情况输出 \(k-(n\bmod k)\)

#include<bits/stdc++.h>
using namespace std;
int n,k;
signed main()
{
	cin>>n>>k;
	if(n%k==0)cout<<k<<endl;
	else cout<<(k-n%k)<<endl;
	return 0;
}

T2

遇事不决先暴力,经过我对于样例的打表发现, \(n\) 为偶数时序列的值只有两种情况来回交替,\(n\) 为奇数时全为变换后的序列,所以对于 \(n\) 为偶数的情况,需要在分两种情况讨论:一是当 \(k\) 为偶数的时候,就是原序列,二是当 \(k\) 为奇数的时候,就是变换后的序列;对于 \(n\) 为奇数的情况就直接输出变换后的序列。

当然这题远不止于此,因为 \(n\le 10^{5}\),所以我们不能暴力 \(n^{2}\) 求变换后的序列,所以我们想到异或的一个性质,一个数异或两次同一个数值不变,我们直接把所有的数都异或起来然后和每一个数都异或一次就可以线性求出来变换后的序列了。

#include<bits/stdc++.h>
#define int long long
#define N 1000100
using namespace std;
int t,n,k,a[N],ans[N],cao,cnt;
inline void print1(){for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;}
inline void print2(){for(int i=1;i<=n;i++)cout<<ans[i]<<" ";cout<<endl;}
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}
inline void cnm()
{
	cnt++;cao=0;
	for(int i=1;i<=n;i++)cao^=a[i];
	for(int i=1;i<=n;i++)ans[i]=cao^a[i];
	cout<<cnt<<":  ";
	for(int i=1;i<=n;i++)
	  cout<<ans[i]<<' ';
	cout<<endl;
	for(int i=1;i<=n;i++)a[i]=ans[i];
	return ;
}
signed main()
{
//	freopen("55.out","w",stdout);
	t=read();
	while(t--)
	{
		n=read(),k=read();cao=0;
		for(int i=1;i<=n;i++)a[i]=read(),cao^=a[i];
		for(int i=1;i<=n;i++)ans[i]=cao^a[i];
		if(n%2==0&&k%2==0)print1();
		else print2();
//		for(int i=1;i<=k+100;i++)cnm();
	}
	return 0;
}

T3

不算很难想的贪心。

我们从题目里可以看出来对于火的攻击,肯定是优先让大的都打双倍伤害最优;对于冰属性的攻击,我们可以发现用小的和大的和火攻击打反应的收益是没有区别的,所以我们把两个数组排序一下,然后尽量多的打反应,我们看当前没用过的最大的冰和火哪个先打收益高,最后把没法打反应的直接加到答案里就好了。

#include<bits/stdc++.h>
#define int long long
#define N 1000100
using namespace std;
int n,m,k,len,a[N],b[N],ans;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}
signed main()
{
//	freopen("genshin5.in","r",stdin);
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++)b[i]=read();
	sort(a+1,a+n+1);
	sort(b+1,b+m+1);
	len=min(n,m);
	int l1=1,r1=n,l2=1,r2=m;
//	for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;
//	for(int i=1;i<=m;i++)cout<<b[i]<<" ";cout<<endl;
	for(int i=1;i<=len;i++)
	{
		int cao1=a[r1]*2+b[r2];
		int cao2=a[r1]+b[r2]+k;
		if(cao1>=cao2)ans+=cao1,r1--,r2--;
		else ans+=cao2,r1--,r2--;
//		cout<<ans<<" ";
	}
	for(int i=l1;i<=r1;i++)ans+=a[i];
	for(int i=l2;i<=r2;i++)ans+=b[i];
//	cout<<endl;
	cout<<ans<<endl;
	return 0;
}

T4

考试的时候没有思路,先咕掉。

posted @ 2023-04-22 19:12  北烛青澜  阅读(42)  评论(0编辑  收藏  举报