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