あいさか たいがblogAisaka_Taiga的博客
//https://img2018.cnblogs.com/blog/1646268/201908/1646268-20190806114008215-138720377.jpg

2023.4.22洛谷月赛解题报告

2023.4.22洛谷月赛解题报告

传送门

T1#

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

Copy
#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 为奇数的情况就直接输出变换后的序列。

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

Copy
#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#

不算很难想的贪心。

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

Copy
#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 @   北烛青澜  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
目录