黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)题解
B题
群友们在排列数字
题目描述 :
群友们在玩一个游戏,共n个人在玩 每个人要在0-(n-1)中选一个数,注意每个数只能选择一次,
然后按照先后选择顺序拼成一个数,计算组成的数字是否可以整除k,
群友们想知道,如果选择方案不重复,最多有多少种情况可以整除k?
如果不可能整除k请输出-1;
输入描述:
第一行输入两个正整数 n,k
1<=n<=10,1<=k<=1e7
输出描述:
输出结果
示例1
输入:2 1 输出:2
说明:
01 10 两种组合除以1都可以除开
题解:全排列枚举判断
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ int n,k,a[15],num=0; scanf("%d %d",&n,&k); for(int i=0;i<=n-1;i++){ a[i]=i; } do{ ll ans=0; for(int i=0;i<n;i++){ ans= ans*10 + a[i]; } if(ans%k==0){ num++; } }while(next_permutation(a,a+n)); if(num==0) printf("-1"); else printf("%d",num); }
C题
这一天gg拿到了一份,超多的考试数据a 。
老师要求他按照询问数据告诉老师,第几个到第几个同学的分数和是多少 ?
gg最近入职字节跳动了,没有时间处理这种极其简单的问题,所以请你顺手秒一下。
输入描述:
第一行n m ( n个同学 m次询问)
1<=n<=1e6
1<=m<=1e4
第二行输入n个整数表示成绩
a1 a2 .....an (0<=ai<=100) 1<=i<=n
以下m行为两个整数bi bj 表示第几个到第几个同学(从1开始)
1<=bi<=bj<=n
输出描述:
m行查询结果
题解:b数组预处理,根据两指针位置调用即可
#include <bits/stdc++.h> using namespace std; inline int intRead(){ int ans=0,sign=1; char ch = getchar(); if(ch==' '||ch=='\n') exit(0); while(ch<'0'||ch>'9'){ if(ch=='-') sign=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ ans = ans*10 + ch - '0'; ch=getchar(); } return ans*sign; } int n,m,a[1000005],b[1000005]; int main(){ n=intRead(),m=intRead(); for(int i=1;i<=n;i++){ a[i] = intRead(); b[i] = b[i-1] + a[i]; } while(m--){ int t1,t2,ans=0; t1=intRead(),t2=intRead(); ans = b[t2]-b[t1-1]; printf("%d\n",ans); } }
F题
题目描述 **
**我们都知道有一种位运算叫做异或,那么这道题是一道思维题。
给出一个整数n,请求出1-n之间选取两个数进行异或最大能得出多大?(两个数可以相同)
输入描述:
1 ≤ N ≤1e18
输出描述:
无
题解:结论题,找出第一个(严格)大于n的2次幂再减一即可
#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main(){ ull n,t=1; scanf("%lld",&n); while(n>0){ t<<=1,n>>=1; } printf("%lld",t-1); }
G题
如果一句话中存在Alan,那么那句话中的%都算%了Alan。由于可能话中有空格,所以去掉空格后形成的Alan也算Alan。
输入描述:
第一行输入整数n表示聊天记录行数
1<=n<=1000
以下n行每行一个字符串s代表聊天记录
1<=s.length<=1000
输出描述:
输出%Alan次数
题解:注意不用考虑Alan出现的次数,有即可
#include <bits/stdc++.h> using namespace std; int main(){ int n,ans=0; scanf("%d",&n); getchar();//防止回车被getline读取 while(n--){ string s; getline(cin,s); int num=0; for(int i=0;i<s.length();i++){ if(s[i]==' ') s.erase(s.begin()+i),i--;//防止漏处理空格 else if(s[i]=='%') num++; } if(s.find("Alan")!=string::npos) ans+=num; } printf("%d",ans); }
H题
题目描述 **
**这一天cg写了一个卡迪亚酒店客户端,客户端的数据是一张由用户名s,密码m,性别x,电话h组成的表,他想以用户的用户名为基准进行一下排序,短的在前,同样长度按照字典序小的在前,同用户名先输入的在前面。但是曹哥太忙了所以找你帮忙写一下数据处理。
输入描述:
n分数据 **
*1<=n<=100 *
*以下n行 为 s m x h *
*1<= s.length <=20 *
*1<= m.length <=20 *
*1<= x.length <=20 *
*1<= h.length <=20 *
**输出描述:
根据用户名排序规则排序后输出
题解:简单的排序
#include <bits/stdc++.h> using namespace std; inline string stringRead(){ string ans; char ch=getchar(); while(ch==' '||ch=='\n'||ch=='\t') ch=getchar(); while(ch!=' '&&ch!='\n'&&ch!='\t') ans+=ch,ch=getchar(); return ans; } struct node{ string s,m,x,h; int id; }a[105]; bool cmp(node b,node c){ if(b.s.length()!=c.s.length()){ return b.s.length()<c.s.length(); }else if(b.s.compare(c.s)!=0){ return b.s<c.s; }else{ return b.id<c.id; } } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ a[i].s = stringRead(); a[i].m = stringRead(); a[i].x = stringRead(); a[i].h = stringRead(); a[i].id = i; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++){ cout<<a[i].s<<" "<<a[i].m<<" "<<a[i].x<<" "<<a[i].h<<endl; } }
I题
题目描述 **
**这一天cg写了一个卡迪亚酒店客户端,客户端的数据是一张由用户名s,密码m,性别x,电话h组成的表,他想以用户的用户名为基准进行一下排序,短的在前,同样长度按照字典序小的在前,同用户名先输入的在前面。但是曹哥太忙了所以找你帮忙写一下数据处理。
输入描述:
n分数据
1<=n<=1e6
以下n行 为 s m x h
1<= s.length <=20
1<= m.length <=20
1<= x.length <=20
1<= h.length <=20
输出描述:
根据用户名排序规则排序后输出
题解:相对于H题加强了数据范围,但代码思路是一样的
#include <bits/stdc++.h> using namespace std; inline string stringRead(){ string ans; char ch=getchar(); while(ch==' '||ch=='\n'||ch=='\t') ch=getchar(); while(ch!=' '&&ch!='\n'&&ch!='\t') ans+=ch,ch=getchar(); return ans; } struct node{ string s,m,x,h; int id; }a[1000005]; bool cmp(node b,node c){ if(b.s.length()!=c.s.length()){ return b.s.length()<c.s.length(); }else if(b.s.compare(c.s)!=0){ return b.s<c.s; }else{ return b.id<c.id; } } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ a[i].s = stringRead(); a[i].m = stringRead(); a[i].x = stringRead(); a[i].h = stringRead(); a[i].id = i; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++){ cout<<a[i].s<<" "<<a[i].m<<" "<<a[i].x<<" "<<a[i].h<<endl; } }
J题
比赛开始了清楚姐姐喊了一句:签到了签到了 选手们纷纷开始签到,现在给出n个数字代表选手们签到所用秒数 请给出第几个选手最先签到。同秒数先输入的算快。
(不会吧 不会吧 不会有人用牛客不知道清楚姐姐吧)
输入描述:
第一行输入一个整数n
1<=n<=10000
第二行输入n个整数s
0<=s<=1000
输出描述:
一个数
题解:记录每次最小值的id即可
#include <bits/stdc++.h> using namespace std; int main(){ int n,id=0,MIN=1005,s; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&s); if(s<MIN) MIN=s,id=i; } printf("%d",id); }