本文主要是介绍黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)(慕云杯)——题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
比赛网页链接
https://ac.nowcoder.com/acm/contest/11471?from=acm_calendar#question
题目从易到难排序了
签到J. 比赛开始了清楚姐姐喊了一句:签到了签到了
遍历找最小更新序号。
#include<bits/stdc++.h>
using namespace std;int a[10005];
int n;int main()
{scanf("%d",&n);int x=-1;int minv=1e9;for(int i=0;i<n;i++){scanf("%d",&a[i]);if(a[i]<minv){x=i+1;minv=a[i];}}printf("%d\n",x);return 0;
}
签到H.cg写项目
sort练习题
#include<bits/stdc++.h>
using namespace std;
#define ll long longstruct student
{string a;string b;string c;string d;int sign;
}s[105];bool cmp(student A,student B)
{if(A.a.size()!=B.a.size())return A.a.size()<B.a.size();else if(A.a!=B.a){return A.a<B.a;}else{return A.sign<B.sign;}}int n;int main()
{scanf("%d",&n);for(int i=0;i<n;i++){cin>>s[i].a>>s[i].b>>s[i].c>>s[i].d;s[i].sign=i;}sort(s,s+n,cmp);for(int i=0;i<n;i++){cout<<s[i].a<<' '<<s[i].b<<' '<<s[i].c<<' '<<s[i].d;puts("");}return 0;
}
签到 I.cg写项目加强版
除了数组大小不同,我没感觉和H有什么区别
#include<bits/stdc++.h>
using namespace std;
#define ll long longstruct student
{string a;string b;string c;string d;int sign;
}s[100005];bool cmp(student A,student B)
{if(A.a.size()!=B.a.size())return A.a.size()<B.a.size();else if(A.a!=B.a){return A.a<B.a;}else{return A.sign<B.sign;}}int n;int main()
{scanf("%d",&n);for(int i=0;i<n;i++){cin>>s[i].a>>s[i].b>>s[i].c>>s[i].d;s[i].sign=i;}sort(s,s+n,cmp);for(int i=0;i<n;i++){cout<<s[i].a<<' '<<s[i].b<<' '<<s[i].c<<' '<<s[i].d;puts("");}return 0;
}
F. happy的异或运算
思(gui)维(lv)题,看样例找规律,看能除以多少个2就行,除的时候向下取整不用处理,只需特判1即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long longll n;
long long fastPower(long long base, long long power) {long long result = 1;while (power > 0) {if (power & 1) {//此处等价于if(power%2==1)result = result * base ;}power >>= 1;//此处等价于power=power/2base = (base * base) ;}return result;
}//快速幂板子int main()
{scanf("%lld",&n);if(n==1){printf("0\n");}else{ll sum=0;while(n){n=n/2;sum++;}ll res=fastPower(2,sum)-1;printf("%lld\n",res);}return 0;
}
G.Alan%%%
硬暴力就行,我拿的字符数组c语言写的,唯一一个c提交代码
#include<stdio.h>int n,m;int main()
{scanf("%d",&n);getchar();int sum=0; for(int ii=0;ii<n;ii++){char a[1005];int res=0;gets(a);int y=strlen(a);for(int i=0;i<y;i++){if(a[i]=='%')res++;}int flag=0;for(int i=0;i<y&&!flag;i++){int flag1=0;if(a[i]=='A'){for(int j=i+1;j<y&&!flag1;j++){int flag2=0;if(a[j]!=' '&&a[j]!='l'){break;}else if(a[j]=='l'){for(int k=j+1;k<y&&!flag2;k++){if(a[k]!=' '&&a[k]!='a'){flag1=1;break;}else if(a[k]=='a'){for(int p=k+1;p<y;p++){if(a[p]!=' '&&a[p]!='n'){flag2=1;break;}else if(a[p]=='n'){flag2=1;flag1=1;flag=1;break;}}}}}}}}if(flag){sum+=res;}}printf("%d\n",sum);return 0;
}
C. gg查成绩
这题云哥说榜歪了,但是属于会的就会,而且巨简单,不会就是不会,做法就是入门前缀和,了解前缀和的都很轻松。
#include<bits/stdc++.h>
using namespace std;int a[1000005];
int n,m;int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){a[i]+=a[i-1];}for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",a[y]-a[x-1]);}return 0;
}
B.群友们在排列数字
dfs全排列数就行,但是做的时候,一个是没有在0的时候输出-1,一个是没开long long WA了好几发,罚时罚上天,顺带一提,按我这样把数组换成数,我第一发交的时候用的pow,直接超时1001ms,所以用了快速幂板子,快速幂还是香啊。
#include<bits/stdc++.h>
using namespace std;long long a[10];
long long n,k;
long long st[10];
long long sum=0;long long fastPower(long long base, long long power) {long long result = 1;while (power > 0) {if (power & 1) {//此处等价于if(power%2==1)result = result * base ;}power >>= 1;//此处等价于power=power/2base = base * base;}return result;
}long long fun()
{long long sum1=0;for(long long i=0;i<n;i++){sum1+=a[i]*fastPower(10,i);}return sum1;
}void dfs(long long step)
{long long i;if(step==n){long long x=fun();if(x%k==0){sum++;}return;}for(i=0;i<=n-1;i++){ if(!st[i]) {a[step]=i; st[i]=1; dfs(step+1); st[i]=0; }}return;
}int main()
{scanf("%d%d",&n,&k);dfs(0);if(sum==0){printf("-1\n");}elseprintf("%lld\n",sum);return 0;
}
D.issue与lifehappy给学生分组
二分应用题
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long int
#define INF 1e12ull a[1000005];
ull n,m;ull juge(ull mid)
{ull seg = 0;ull sum = 0;for (ull i = 0; i < n; i++){sum += a[i];if (sum > mid){sum = a[i];seg++;}}if (seg >= m) return 0;elsereturn 1;
}ull value(ull low, ull high)
{if (low > high)return high + 1;else{ull mid = (low + high) / 2;if (juge(mid))return value(low, mid - 1);elsereturn value(mid + 1, high);}
}int main()
{scanf("%llu%llu",&n,&m);ull min = INF, max = 0;for (ull i = 0; i < n ; i ++){scanf("%llu",&a[i]);max += a[i];if (a[i] < min)min = a[i];}ull res = value(min, max);printf("%llu\n",res);return 0;
}
比赛时就ac了8题,三十多个ak,但是我还是不能ak,我太菜了,后面找时间把A,E补了,A在群里的时候很多人都说卡读入。
补题:
E. 删删删越小越好
从高位往低位遍历,核心思路是越靠近高位的数字越小越好,对于第 i 个位置的数字,如果左边的数字(1 ~ i-1)位置有比它大的,则删去第 i 个数字左边的数字,直到无法删除或者第 i 个数字左边的数字都小于等于第 i 个数字。剩下的即为答案。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e7+10;string x;
int n;
char f[N];
int len;
int cnt;int main()
{ios::sync_with_stdio(false);cin>>x;cin>>n;int t=x.size();for(int i=0;i<x.size();i++){while(cnt!=n&&x[i]<f[len]&&len!=0){len--;cnt++;}f[++len]=x[i];}int flag=0;for(int i=1;i<=len-(n-cnt);i++){if(f[i]!='0'){flag=1;}if(flag){printf("%c",f[i]);}}if(!flag){printf("0\n");}return 0;
}
A.数组截取
本场指定唯一卡常题,卡读入卡到飞起,群里一片哀鸿遍野,说回本题,撇开卡常读入外,做法是前缀和思想+双指针,核心代码不算难。
#include<bits/stdc++.h>
using namespace std;
long long a[20002000];inline long long read(){long long x = 0;char ch = getchar();while(ch < '0' || ch > '9'){ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x<<1) + (x<<3) + (ch^48);ch = getchar();}return x;
}
int main()
{long long n=read();long long k=read();long long sum=0,MAX=0,j=0;for(long long i=0;i<n;i++){a[i]=read();sum+=a[i];while(sum>k) sum-=a[j++];if(sum==k) MAX=max(MAX,i-j+1);}if(!MAX){printf("-1\n");}else{printf("%lld\n",MAX);}return 0;
}
这篇关于黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)(慕云杯)——题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!