ZZULIOJ-Contest1284 - 18级新生周赛(5)题解

A: 小G的日常之ABABAB

思路:统计一下奇数位和偶数位,每个数字的个数,用总个数减去奇数位和偶数位出现最多的个数就是答案。

#include <bits/stdc++.h>
using namespace std;
int a[1005], b[100005], c[100005];
int main()
{
    int  n;
    scanf("%d",&n);
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
        if(i % 2 != 0) b[a[i]]++;
        else c[a[i]]++;
    }
    int m1 = 0, m2 = 0;
    for(int i = 0; i <= 100000; i++)
    {
        m1 = max(m1, b[i]);
        m2 = max(m2, c[i]);
    }
    int ans = n - m1 - m2;
    printf("%d\n",ans);
 
    return 0;
}

B: 小G的日常之开关灯

思路:从左第一个关灯的位置开始按要求模拟即可。

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
    int n; scanf("%d",&n);
    for(int i = 0; i < n; i++)
        scanf("%d",&a[i]);
    int flag = 0, cnt = 0;
    while(1)
    {
        flag = 0;
        for(int i = 0; i < n; i++)
        {
            if(a[i] == 0)
            {
                for(int j = i; j < n; j++)
                {
                    if(a[j] == 0) a[j] = 1;
                    else a[j] = 0;
                }
                cnt++;
            }
        }
        for(int i = 1; i < n; i++)
        {
            if(a[i] == a[i-1] && a[i] == 1)
                continue;
            else flag = 1;
        }
        if(!flag) break;
 
    }
    printf("%d\n",cnt);
    return 0;
}

C: 小G的日常之折扣票价 

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
    double a, b, c;
    scanf("%lf%lf",&a,&b);
    c = b / 2.0;
    printf("%.2f",a+c);
    return 0;
}

D: 小G的日常之签到

#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
    int a, b;
    scanf("%d%d",&a,&b);
    for(int c = a; c <= b; c++)
    {
        if(a * b * c % 2 != 0)
        {puts("Yes"); return 0;}
    }
    puts("No");
    return 0;
}

 E: 小G的日常之算术题

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    char s[5][70]={"#####......#..#####..#####..#...#..#####..#####..#####..#####..#####","#...#......#......#......#..#...#..#......#..........#..#...#..#...#","#...#......#..#####..#####..#####..#####..#####......#..#####..#####","#...#......#..#..........#......#......#..#...#......#..#...#......#","#####......#..#####..#####......#..#####..#####......#..#####..#####"};
    scanf("%d %d",&a,&b);
    int ans = a + b;
    int x[20], l = 0;
    if(ans == 0)
    {
        x[0] = 0;
        l++;
    }
    while(ans != 0)
    {
        x[l++] = ans % 10;
        ans = ans / 10;
    }
    for(int j = 0; j < 5; j++)
    {
        for(int i = l - 1; i >= 0; i--)
        {
            if(x[i] == 0)
            for(int k = 0; k < 5; k++)
            printf("%c",s[j][k]);
            if(x[i] == 1)
            for(int k = 7; k < 12; k++)
            printf("%c",s[j][k]);
            if(x[i] == 2)
            for(int k = 14; k < 19; k++)
            printf("%c",s[j][k]);
            if(x[i] == 3)
            for(int k = 21; k < 26; k++)
            printf("%c",s[j][k]);
            if(x[i] == 4)
            for(int k = 28; k < 33; k++)
            printf("%c",s[j][k]);
            if(x[i] == 5)
            for(int k = 35; k < 40; k++)
            printf("%c",s[j][k]);
            if(x[i] == 6)
            for(int k = 42; k < 47; k++)
            printf("%c",s[j][k]);
            if(x[i] == 7)
            for(int k = 49; k < 54; k++)
            printf("%c",s[j][k]);
            if(x[i] == 8)
            for(int k = 56; k < 61; k++)
            printf("%c",s[j][k]);
            if(x[i] == 9)
            for(int k = 63; k < 68; k++)
            printf("%c",s[j][k]);
            if(i != 0)
            printf("..");
        }
        printf("\n");
    }
}


  F: 小G的日常之股票

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t, n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int mx = 0, x;
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&x);
            mx = max(mx, x);
        }
        printf("%d\n",mx);
 
    }
    return 0;
}

  G: 小G的日常之游戏(二)

思路:用map映射一下,然后按要求模拟。 

#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
int main()
{
    int  n, flag = 0;
    scanf("%d",&n); string s, st, se;
    cin >> s; mp[s]++; se = s[s.length()-1];
    for(int i = 0; i < n - 1; i++)
    {
        cin >> s;
        st = s[0];
        if(st != se) flag = 1;
        mp[s]++;
        if(mp[s] > 1) flag = 1;
        se = s[s.length()-1];
    }
    if(!flag) puts("Yes");
    else puts("No");
 
    return 0;
}

H: 小G的日常之烦心事

思路:式子化简一下就很容易了。

当a[j]-a[i]>0时,abs(a[j]-a[i])+j-i=  a[j] - a[i] + j - i = (a[j] + j) - (a[i] + i)。

当a[j]-a[i]<0时,abs(a[j]-a[i])+j-i=  a[i] - a[j] + j - i = (a[i] - i)-(a[j] - j)。

 

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int main()
{
    int n, mx = 0, mi = N, sum;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
    for(int i = 1; i <= n; i++)
    {
        a[i] -= i;
        mx = max(a[i],mx);
        mi = min(a[i],mi);
    }
    sum = mx - mi; mx = 0, mi = N;
    for(int i = 1; i <= n; i++)
    {
        a[i] += 2*i;
        mx = max(a[i],mx);
        mi = min(a[i],mi);
    }
    sum = max(sum, mx - mi);
    printf("%d\n",sum);
    return 0;
} 

I: 小G的日常之游戏

思路:不知道为啥用string会超时,那就用char 直接模拟吧。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
char a[N];
int main()
{
    cin >> a;
    int len = strlen(a);
    while(1)
    {
        int flag = 0, k = 0;
        for(int i = 0; i < len - 1; i++)
        {
            if(a[i] != '*')
            {
                for(int j = i+1 ; j < len ; j++)
                {
                    if(a[j] != '*')
                    {
                        k = j;
                        break;
                    }
                }
                if(a[i] == a[k])
                {
                    a[i] = a[k] = '*';
                    flag = 1;
                }
            }
        }
        if(!flag) break;
    }
    for(int i = 0; i < len; i++)
        if(a[i] != '*') cout << a[i];
}

 J: 小G的日常之接雨水

思路:方法一从左扫一遍然后从右扫一遍,方法二双指针左右同时扫,现在只讲方法二,首先接雨水的多少肯定取决于最短柱子(木桶原理),我们维护左右两个最高的柱子,然后分别用两条指针,分别从两端向最高的柱子靠近,如果柱子大于前面柱子的最大值则不存在积水,小于则存在积水,积水量等于前面柱子的最大值减去此柱子高度。 

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6+10;
int main() 
{
    int n, a[maxn]; scanf("%d",&n);
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);
    int l = 0, r = n - 1, rmax = 0, lmax = 0;
    ll ans = 0;
    while(l < r)
    {
        lmax = max(lmax, a[l]);
        rmax = max(rmax, a[r]);
        if(lmax < rmax)
            ans += lmax - a[l], l++;
        else
            ans += rmax - a[r], r--;
    }
    printf("%lld\n", ans);
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值