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);
}


京公网安备 11010502036488号