黑龙江农垦科技职业学院喜迎寒假多校联赛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 long

struct 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 long

struct 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 long

ll 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/2
        base = (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/2
        base = 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");
    }
    else
    printf("%lld\n",sum);
    return 0;
}

D.issue与lifehappy给学生分组
二分应用题

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long int
#define INF 1e12

ull 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;
	else
		return 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);
		else
			return 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;
}

猜你喜欢

转载自blog.csdn.net/Star_Platinum14/article/details/113066106