思维与模拟

1.怪兽大逃杀(最大公因数)

输入样例:

【样例13
2 6 6
【样例215
546 3192 1932 630 2100 4116 3906 3234 1302 1806 3528 3780 252 1008 588

输出样例:

【样例12
【样例242

题目描述:
如样例所示,给出一串数字,找出其中的最大值A和最小值a,将A=A-a,重复以上操作,直到数列中所有的数都相等。
代码如下:

#include <bits/stdc++.h>
using namespace std;
int a[100000];
int main()
{
    int n;
    cin >>n;
    int x;
    cin >>x;
    int sum=x;
    for(int i=1; i<n; i++)
    {
        cin >>x;
        sum=__gcd(sum,x);
    }
    cout <<sum<<endl;
    return 0;
}

2.

题目描述:
给定三个正整数 A、B 和 C。计算以下值模 998244353:
在这里插入图片描述

约束
1≤A,B,C≤10^9
测试样例:

输入:
【样例11 2 3
【样例21000000000 987654321 123456789
输出:
【样例118
【样例2951633476

代码如下:

#include<bits/stdc++.h>
using namespace std;
const long long M=998244353;
int main()
{
    long long a,b,c;
    cin>>a>>b>>c;
    long long n1=(a+1)*a/2%M;
    long long n2=(b+1)*b/2%M;
    long long n3=(c+1)*c/2%M;
    long long n4=n1*n2%M;
    long long n5=n3*n4%M;
    cout<<n5<<endl;
    return 0;
}

3.问题 D: Quadruple

输入样例1:

2 1

输出样例1:

4

输入样例2:

2525 -425

输出样例2:

10314607400

题目描述:
给定整数 N 和 K。有多少个整数 (a,b,c,d) 满足以下两个条件?
1≤a,b,c,d≤N
a+b−c−d=K
约束条件
1≤N≤10e5
−2(N−1)≤K≤2(N−1)
输入中的所有数字都是整数。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,k,a,b,arr[200010]={0};
    long long sum=0;
    scanf("%lld %lld",&n,&k);
    long long mid=n+1;
    for(long long i=2;i<=2*n;i++)
    {
        if(i<=mid)
        {
            if(i%2==0)
            {
                b=(i/2-1)*2+1;
                arr[i]=b;
            }
            else
            {
                b=i/2*2;
                arr[i]=b;
            }
        }
        else
        {
            arr[i]=arr[2*mid-i];
        }
    }
    for(long long i=2;i<=2*n;i++)
    {
        if(i-k>=2&&i-k<=2*n)
        {
            sum=sum+arr[i]*arr[i-k];
        }
    }
    printf("%lld\n",sum);
    return 0;
}

4.中石油–1106

题目描述:
在这里插入图片描述
如图所示,将679以上图这种方式变成6(一位数)需要5次,题目要求输入一个数据,输出次数。
代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[10];
    while(scanf("%s",arr)!=EOF)
    {
        int flag=1,count=0;
        while(flag==1)
        {
            long long len=strlen(arr),sum=1;
            if(len==1||len==0)//等于零的情况不要忽略
                flag=0;
            for(int i=0;i<len;i++)
            {
                sum=(arr[i]-'0')*sum;
            }
            memset(arr,'\0',sizeof(arr));//数组初始化
            if(flag==1)
            {
                count++;
                for(int i=0;sum>0;i++)//将新得到的数变成字符数组
                {
                    arr[i]=(sum%10)+'0';
                    sum=sum/10;
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}

5.Min-Max 的乘积

题目描述:
给定一个由 N 个整数组成的序列 A。A 有 2^N -1 个非空子序列 B。求所有子序列的 max(B)×min(B) 之和。由于答案可能很大,因此答案取模 998244353。
测试样例:

输入:
【样例13
2 4 3
【样例21
10
【样例37
853983 14095 543053 143209 4324 524361 45154
输出:
【样例163
【样例2100
【样例3206521341

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;

const long long N = 2e5 + 3,mod= 998244353;
long long arr[N];
int main()
{
    int n;
    scanf("%d",&n);
    long long sum = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &arr[i]);
        sum += arr[i] * arr[i] % mod;
    }
    sort(arr + 1, arr + 1 + n);
    int t = 0;
    for (int i = 1; i <= n; i++)
    {
        sum =(sum+ arr[i] * t )% mod;
        t= (t * 2 + arr[i]) % mod;
    }
    printf("%lld\n", sum);
    return 0;
}

解题思路:
在这里插入图片描述

6.交换数

测试样例:

输入:
5
2 3 1 5 4
输出:
3

代码如下:

 #include<iostream>
 using namespace std;
 
 int arr[10010];
 int n;
 int cnt;
 
 int main()
 {
     cin>>n;
     for(int i=1;i<=n;i++) cin>>arr[i];
     int i=1;
     while(1)
     {
         if(arr[i]!=i)
         {
             cnt++;
             int t=arr[i];
             arr[i]=arr[t];
             arr[t]=t;
         }
         if(i==n) break;
         else if(arr[i]!=i) continue;
         else i++;
     }
     cout<<cnt<<endl;
     return 0;
 }

7. 小凯的疑惑

在这里插入图片描述

#include<iostream>
using namespace std;

int main()
{
    long long a,b;
    scanf("%lld %lld",&a,&b);
    printf("%lld",a*b-a-b);
    return 0;
}

8.蚂蚁感冒

长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入格式
第一行输入一个整数 n, 表示蚂蚁的总数。接着的一行是 n 个用空格分开的整数 Xi, Xi 的绝对值表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。

输出格式
输出1个整数,表示最后感冒蚂蚁的数目。

数据范围
1<n<50,
0<|Xi|<100
输入样例1:

3
5 -2 8

输出样例1:

1

输入样例2:

5
-10 8 -20 12 25

输出样例2:

3
#include<iostream>
#include<algorithm>
using namespace std;

int a[51],p[51];
bool cmp(int x,int y)
{
    return abs(x)<abs(y);
}
int main()
{
    int n,k;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    int aa=a[0];
    sort(a,a+n,cmp);//按其绝对值排序
    for(int i=0;i<n;i++)
    {
        if(aa==a[i]) k=i;
        if(a[i]>0) p[i]=1;//转0,1比较方便理解
        else p[i]=0;
    }
    if(aa>0)
    {
        int res=1;
        for(int i=k+1;i<n;i++)
        {
            if(p[i]==0) res++;
        }
        if(res>1)//若存在右0,才会感染左1
        {
            for(int i=0;i<k;i++)
            {
                if(p[i]==1) res++;
            }
        }
        cout<<res<<endl;
        return 0;
    }
    else
    {
        int res=1;
        for(int i=0;i<k;i++)
        {
            if(p[i]==1) res++;
        }
        if(res>1)//若存在左1,才会感染右0
        {
            for(int i=k+1;i<n;i++)
            {
                if(p[i]==0) res++;
            }
        }
        cout<<res<<endl;
        return 0;
    }
}

9. 约瑟夫问题

在这里插入图片描述

输入:
6 2
12 4
8 3
0 0
输出:
5
1
7
#include<iostream>
#include<cstring>
using namespace std;

int n,m;
int arr[310];

int main()
{
    while(cin>>n>>m,n||m)
    {
        memset(arr,0,sizeof arr);
        int k=1;
        for(int i=1; i<n; i++)
        {
            int cnt=0;
            //int k=1;
            while(cnt<m)
            {
                if(k==n+1) k=1;
                if(arr[k++]==0) cnt++;
            }
            arr[k-1]=1;
        }
        for(int i=1;i<=n;i++)
        {
            if(arr[i]==0) cout<<i<<endl;
        }
    }
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢nn

心动不如行动,感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值