黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)-题解总结

本文主要是介绍黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)-题解总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

附上链接:
黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)
在这里插入图片描述
总体:由于考试的时候是按照通过率的节奏来走的,所以像A,B题,一开始都没有打算开题,最后阶段一直死磕D题的二分,直到结束也没找出错误来。。。。。。
最后发现。。。。二分的上界和下届写错了。。。。。。裂开

A数组截取

思路很简单,用两个指针的方式,左指针先不动,右指针往后移,如果不满足条件,左指再往后移,最后找出最长区间。。多么简单啊。。。再也不跟AC率做题了。。。。

据出题人说数据范围很大,建议使用快读。

附上AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 77797;
#define iss ios::sync_with_stdio(false)
inline ll read(){ll s = 0, w = 1; char ch = getchar();while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();return s * w;
}
ll a[20000005];
int main(){ll n = read(),k = read();ll l = 0,sum = 0,ans = -1;for(int i = 0 ; i < n ;++i){a[i] = read();sum += a[i];while(sum > k) sum -= a[l++];if(sum == k) ans = max(ans,i - l + 1);}printf("%lld\n",ans);
}

小结:通过这题,又再一次复习了双指针的用法。l,r真是妙呀。

B排列数字

没啥好说的,直接暴力枚举判断是否满足条件,用dfs或者STL next_permutation(a,a+n)

#include<bits/stdc++.h>
using namespace std;
#define f(i,a,b)  for(int i=(a);i<=(b);i++)
int n,m;
long long a[20];
int ans;
int main()
{  cin>>n>>m;f(i,0,n-1)a[i]=i;do{long long sum=0;f(i,0,n-1){sum=sum*10+a[i];}if(sum%m==0)ans++;}while(next_permutation(a,a+n));if(ans)cout<<ans;elsecout<<-1; }

C查成绩

水题,前缀和,没啥好说的

#include<iostream>
#include<cstdlib>
#include<queue>
#define ll long long
using namespace std;
ll a[1000010];
char ch;
ll read(){while(ch =getchar(), ch < '0' || ch > '9');ll res = ch - 48;while(ch = getchar(), ch >= '0' && ch <= '9')res = res * 10 + ch - 48;return res;
}
int main(){ll n,m,i,x,y;n = read(),m = read();for(i = 1;i <= n;i ++)x = read(),a[i] = a[i-1] + x;while(m--){x = read();y = read();cout<<a[y] - a[x-1]<<endl;}return 0;
}

D学生分组(求区间最大值的最小值)

第一感觉是个典型的DP,于是开始无脑写DP,写着写着,回去看了一下数据范围。。
于是开始写二分,大概15分钟左右,写出二分。。于是这场比赛开始无限卡壳了,

思路:二分答案,判断是否满足条件。

二分的核心代码,check()函数:

int check(ull mid)
{ull s=1;ull sum=0;for(int i=0;i<m;i++){sum=sum+a[i];if(sum>mid){ sum=a[i];s++;}   if(s>k)return false;}return true;
}

小结:给学生分组的代码,值得反复推敲 。

如果枚举到有答案更大,则不满足,另减去当前a[i]值,上一组分为一组,分组数加1

for(int i=0;i<m;i++){sum=sum+a[i];if(sum>mid){ sum=a[i];s++;}   

如果大于分组数,则不满足条件要求:

if(s>k)return false;

值得思考的是,只要分组数小于等于K,就满足条件。题目条件是求区间和最大值的最小值,如果分组更小的答案都满足条件,那么K组的也一定满足条件。

附上赛后AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
unsigned long long m,k;
ull a[1000020];
ull maxx,minn;
char ch;
ull read(){while(ch =getchar(), ch < '0' || ch > '9');ull res = ch - 48;while(ch = getchar(), ch >= '0' && ch <= '9')res = res * 10 + ch - 48;return res;
}
int check(ull mid)
{ull s=1;ull sum=0;for(int i=0;i<m;i++){sum=sum+a[i];if(sum>mid){ sum=a[i];s++;}   if(s>k)return false;}return true;
}
int main()
{     //freopen("in.txt","r",stdin);scanf("%lld%lld",&m,&k); for(ull i=0;i<m;i++){a[i]=read(); maxx+=a[i];if(minn<a[i])minn=a[i];}while(maxx>minn){ull mid=(maxx+minn)/2; if(check(mid))maxx=mid;elseminn=mid+1;}cout<<maxx;  
} 

原因竟然只是出在这里:

    if(check(mid))maxx=mid;elseminn=mid+1;

一开始我一直写成这样:

    if(check(mid))maxx=mid+1;elseminn=mid;

对二分的理解还是不够。。。。有点背模板的感觉。

二分是上届和下届不清楚的同学,最好是先手动模拟几个样例

E:删数问题

N久以前做过这道题,当时用贪心的方法

于是写了贪心的算法,超时。。。数据范围应该是扩大了

后面交流听大佬说用单调栈,不是很熟练单调栈的用法,后期再补。

F异或运算

结论题:
  让 n 对应二进制每一位都为 1 即为答案。

#include<iostream>
using namespace std;
int main(){long long n;long sum = 1;int len = 0;scanf("%lld",&n);while(n){n /=2;len++;}while(len--){sum *= 2;}cout<<sum-1;return 0;
}

G%%%Alan

在一个地方,卡了好久!!!!!!!

这里一定要注意,用getchar()去掉回车

scanf("%d",&n);  
getchar();//scanf()会带来一个回车,用getchar()去掉它,这是为了下面的gets 
gets(s);

附上AC代码:

#include<bits/stdc++.h>
using namespace std;
long long n;
string s;
int  z[2000];
bool g[2000];
int mark=0;
int sum;
int main()
{     int now;//freopen("in.txt","r",stdin);
scanf("%d",&n);getchar();for(int i=1;i<=n;i++){  getline(cin,s);mark=0;int sa=s.size();for(int j=0;j<sa;j++){if(s[j]=='A'){mark++;now=j+1;while(s[now]==' ')now++;if(s[now]=='l'){mark++;now++;while(s[now]==' ')now++;if(s[now]=='a'){  mark++;now++;while(s[now]==' ')now++;if(s[now]=='n') {mark++;now++;}}}}if(mark==4){break;	}}if(mark==4) for(int j=0;j<sa;j++)if(s[j]=='%')sum++;}printf("%d",sum);} 

H&Icg写项目

结构体排序,没啥好说的。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<deque>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
struct node
{string s;string m;string x;string h; long long z;
}a[1000200];
int cmp(node b,node c)
{if(b.s==c.s)return b.z<c.z;if(b.s.size()!=c.s.size())return b.s.size()<c.s.size();else if(b.s!=c.s)return b.s<c.s;else return b.z>c.z;
}
int main()
{//freopen("in.txt","r",stdin);cin>>n;for(int i=1;i<=n;i++){cin>>a[i].s>>a[i].m>>a[i].x>>a[i].h;a[i].z=i;}sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++){cout<<a[i].s<<" "<<a[i].m<<" "<<a[i].x<<" "<<a[i].h<<endl;	} } 

J签到题

这篇关于黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)-题解总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166815

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展

【科技明说 | 科技热点关注】 2024戴尔科技峰会在8月如期举行,虽然因事未能抵达现场参加,我只是观看了网上在线直播,也未能采访到DTF现场重要与会者,但是通过数十年对戴尔的跟踪与观察,我觉得2024戴尔科技峰会给业界传递了6大重要信号。不妨简单聊聊:从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展? 1)退出中国的谣言不攻自破。 之前有不良媒体宣扬戴尔将退出中国的谣言,随着2

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return