2021年暑假每日一题(6)

3798 幸运年份(暴力)

任意门

如果一个年份的各位数字中非零数字不超过 1 个,则称该年是一个幸运年。
比如,100,40000,5 都是幸运年,而12,3001,12345 则不是幸运年。

现在,给定你一个年份,请你求出当前年份距离下一个幸运年多少年?

输入格式

第一行包含整数 T,表示共有 T组测试数据。

每组数据包含一个整数 n,表示当前年份。

输出格式

每组数据输出一行,一个整数,表示距离下一个幸运年的年数。

数据范围

1≤T≤100
,
1≤n≤109

输入样例1:

3
4
201
4000
输出样例1:

1
99
1000

直接暴力枚举

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,flag=0;
        cin>>n;
        for(int i=1;;i*=10)
        {
            for(int j=1;j<10;j++)
        {
            if(i*j>n)
            {
                flag=1;
                cout<<i*j-n<<endl;
                break;
            }
        }
        if(flag==1)
        break;
        }
        
    }
    return 0;
}

3799 送糖果(暴力)

任意门
Vladik 有a个糖果,Valera 有b个糖果。两个人回合制的互送礼物给对方。第一轮,Vladik 送给 Valera 1个糖果。第二轮,Valera 送给 Vladik 2
个糖果。第三轮,Vladik 送给 Valera 。个糖果。
以此类推,两人轮流给对方送糖果,且每轮送出的糖果数量都比上一轮多一个。当某一轮,轮到某人送糖果时,如果糖果数量不够了,则停止互送礼物。请问,是谁的糖果率先不够?
注意,每个人都只能送给对方自己事先准备的糖果。自己收到的糖果不得再送还给对方。

输入格式

第一行包含整数 T,表示共有 T组测试数据。

每组数据占一行,包含两个整数 a,b。

输出格式每组数据输出一行结果,如果 Vladik 的糖果率先不够,则输出 Vladik,否则输出 Valera。

数据范围

1≤T≤10
,
1≤a,b≤109

输入样例:

2
1 1
7 6
输出样例:

Valera
Vladik

可以二分,但是这里可以暴力过。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int a,b;
        cin>>a>>b;
        int k=1;
        while(true)
        {
            if(a<k)
            {
                puts("Vladik");
                break;
            }
            a-=k++;
            if(b<k)
            {
                puts("Valera");
                break;
            }
            b-=k++;
        }
    }
    return 0;
}

3800 奇数还是偶数(技巧)

任意门

给定一个整数 n,它可以被表示为一个 k位的 b 进制数,如下所示:

n=a1⋅bk−1+a2⋅bk−2+…+ak−1⋅b+ak

举例说明,如果 b=17,k=3,a=[11,15,7],那么 n=11⋅172+15⋅17+7=3179+255+7=3441。

请你判断 n是奇数还是偶数。

输入格式

第一行包含整数 T,表示共有 T组测试数据。每组数据第一行包含两个整数 b 和 k。

第二行包含 k个整数 a1,a2,…,ak。

n的 b进制表示不含前导 0,也就是说只有 k=1时,a1 才有可能是 0。

输出格式

每组数据输出一行结果,n
是偶数则输出 even,奇数则输出 odd。

数据范围

1≤T≤10,2≤b≤100,1≤k≤105,0≤ai<b,
同一测试点内所有 k的和不超过 105。

输入样例:

4
13 3
3 2 7
10 9
1 2 3 4 5 6 7 8 9
99 5
32 92 85 74 4
2 2
1 0
输出样例:

even
odd
odd
even

要知道一个数的k次方对他的余数没有影响,这题就好做了
如果b是偶数,就要看最后一项,如果b是奇数,就要把所有的相加求其总和

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int b,k,sum=0,last,x,res;
        cin>>b>>k;
        for(int i=0;i<k;i++)
        {
            cin>>x;
            sum+=x;
            last=x;
        }
        res=last%2;
        if(b%2)res=sum%2;
        if(res)puts("odd");
        else puts("even");
    }
    return 0;
}

3801 最佳连续子数组(简单)

任意门
给定一个长度为 n的数组 a1,a2,…,an。请你找到其中的最佳连续子数组。最佳连续子数组需满足:子数组内各元素的算术平均数(即所有元素之和除以元素个数)尽可能大。满足条件 1的前提下,子数组的长度尽可能长。输出最佳连续子数组的长度。

输入格式

第一行包含整数 T,表示共有 T组测试数据。每组数据,第一行包含整数n。

第二行包含 n个整数 a1,a2,…,an。

输出格式

每组数据输出一行结果,表示最佳连续子数组的长度。

数据范围

1≤T≤20,1≤n≤105,0≤ai≤109,同一测试点内所有 n的和不超过 105。

输入样例:

1
5
6 1 6 6 0
输出样例:

2

这个当然是找到最大值,没有事的时候肯定是自身最大,但又要尽可能的长,然后就找到有没有相同的,因为可能最大的值有多个,所以就遍历一下

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
const int N=100010;
int a[N];

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,mx=0,res=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            mx=max(a[i],mx);
        }
       // cout<<mx<<endl;
        for(int i=0;i<n;i++)//双指针算法
        if(a[i]==mx)
        {
            int j=i+1;
            while(j<n&&a[j]==mx)j++;
            res=max(res,j-i);
            i=j-1;
        }
        cout<<res<<endl;
    }
    return 0;
}

由于在双指针算法的时候忘记j<n这一个限制出现了segment fault,段错误!!while算法一定要注意范围,然后几个需要比较大小的常量,或者直接用来相加减的常量一定要赋初始值

3802 消灭数组

任意门
给定一个长度为 n 的数组,如果它不是非降序(非严格单调递增)的,那么就将它的前半部分或后半部分消灭。不断重复这个消灭一半数组的过程,直至数组变为升序为止。请问,得以幸存的数组的最大可能长度是多少?

输入格式

第一行包含整数 T,表示共有 T组测试数据。
每组数据第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an,表示给定数组。

输出格式

输出幸存数组的最大可能长度。

数据范围

1≤T≤10,1≤n≤16,n保证是 2的整数次幂。
1≤ai≤100。

输入样例:

3
4
1 2 2 4
8
11 12 1 2 13 14 3 4
4
7 6 5 4
输出样例:

4
2
1

y总用的深搜,好简单,还有用坐标变换的,就是用cnt来记录左边的逆序个数和右边的逆序个数,然后每一次减去最小的,注意每次要变换左边,记录新的起始位置。但我觉得acwing里面的题目数据真的好小

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
int a[100];

int dfs(int l,int r)
{
    int flag=0;
    for(int i=l;i<r;i++)
    {
        if(a[i]>a[i+1])
        flag=1;
    }
    if(!flag)
    return r-l+1;
    int mid=l+r>>1;
    return max(dfs(l,mid),dfs(mid+1,r));
    
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        cin>>a[i];
        cout<<dfs(0,n-1)<<endl;
    }
    return 0;
}

坐标变化

#include <iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 110;
int a[N];
int t;
bool check( int a[], int st, int ed ) {
    for ( int i = st + 1; i < ed; i++ ) {
        if ( a[i] < a[i-1] ) return false;
    }
    return true;
}

int main( ) {
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        for ( int i = 0; i < n; i++ ) {
            scanf("%d", &a[i]);
        }
        int res = n;
        int st = 0, ed = res;
        while(  res ) {
            if( check(a,st,ed) ) break;
            int cnt1 = 0, cnt2 = 0;
            int x = st, y = ed; // 存一下原来的
            for ( int i = st + 1; i < ed; i++ ) {//记录
                if ( i < st + res / 2 && a[i] < a[i-1] ) cnt1++;
                if ( i >= st + res / 2 && a[i] < a[i-1] ) cnt2++;
            }
            // 坐标变换这里需要注意!!
            if ( cnt1 < cnt2 ) {
                st = x, ed = y / 2;
                res /= 2;
            }
            else {
                st = x + res / 2, ed = y;
                res /= 2;
            }

        }
        cout << res << endl;

    }
    return 0;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值