AtCoder Beginner Contest 367 A~D

本期封面原图 画师えびら

A - Shout Everyday

题意

b点睡觉c点起床,问你a点是不是醒着的

思路

直接判断即可,注意处理跨天的情况

代码

#include <bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

int main()
{
    int a,b,c;
    cin >> a >> b >> c;
    if(b>c)
    {
        if(a>=b or a<=c)
            cout << "No";
        else
            cout << "Yes";
        return 0;
    }
    if(b<=a && a<=c)
        cout << "No";
    else
        cout << "Yes";
    return 0;
}

B - Cut .0

题意

给你一个数,去掉他的无效0,也就是小数点右边末尾的和小数点左边最前面的

思路

直接模拟即可

代码

#include <bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

int main()
{
    string s;
    cin >> s;
    //给一个数字,去掉无效0
    int n=s.length();
    string ans="";
    int flag=0;
    int i;
    for (i=0;i<n;i++)
    {
        if(s[i]=='.')
            break;
        if(flag==0 and s[i]=='0')
            continue;
        else
        {
            flag=1;
            ans+=s[i];
        }
    }
    ans+='.';
    int j;
    for(j=n-1;j>i;j--)
    {
        if(s[j]=='0')
            continue;
        else
            break;
    }
    for(int k=i+1;k<=j;k++)
        ans+=s[k];
    if(ans[0]=='.')
        ans="0"+ans;
    if(ans[ans.length()-1]=='.')
        ans=ans.substr(0,ans.length()-1);
    cout << ans << endl;
    return 0;
}

C - Enumerate Sequences

题意

按升序排列打印所有满足以下条件的长度为 N N N 的整数序列。

  • i i i 个元素介于 1 1 1 R i R_i Ri 之间(包括首尾两个元素)。
  • 所有元素之和是 K K K 的倍数。

思路

数据范围很小,所以直接dfs遍历即可

代码

#include <bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int n,k;
int r[10];
vector<int> ans(10);
void dfs(int dpt,int sum)
{
    if(dpt==n)
    {
        if(sum%k==0)
        {
            for (int i=0;i<n;i++) cout << ans[i] << " ";
            cout << endl;
        }
        return ;
    }
    for(int i=1;i<=r[dpt];i++)
    {
        ans[dpt]=i;
        dfs(dpt+1,sum+i);
    }
}

int main()
{
    cin >> n >> k;
    for (int i=0;i<n;i++) cin >> r[i];
    dfs(0,0);
    return 0;
}

D - Pedometer

题意

一个湖周围有 N N N 个休息区。
休息区按顺时针顺序编号为 1 1 1 2 2 2 、…、 N N N
从休息区 i i i 顺时针走到休息区 i + 1 i+1 i+1 需要 A i A_i Ai 步(其中休息区 N + 1 N+1 N+1 指的是休息区 1 1 1 )。
从休息区 s s s 顺时针走到休息区 t t t s ≠ t s \neq t s=t )所需的最小步数是 M M M 的倍数。
( s , t ) (s,t) (s,t) 的可能对数。

思路

我们可以直接前缀和,然后对前缀和每一个位置取模,模相等的那就说明从前面那个点走到右边那个点算是一对合法对。
然后考虑转了好几圈的情况,我们把这个湖拉直,然后继续往后加,也就是到1之后我还继续走下一轮,无限地往后计算前缀和
在这里插入图片描述
那么现在问题是什么时候结束呢?自然就是某一个点1的前缀和取模后刚好为0,这样就算是完成了一整次循环,最后计算即可

代码

#include <bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int N=4e5+5;
const int M=1e6+5;
ll n,m;
ll a[N];
ll pre[N];
ll cnt[M];
ll ans;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        a[i+n] = a[i];
    }
    for (int i=1; i <= 2*n; i++) {
        pre[i] = pre[i-1]+a[i];
    }
    for (int i = 1; i <= 2*n; i++) {
        if (i <= n) {
            ans += cnt[pre[i]%m];
            cnt[pre[i]%m]++;
        } else {
            cnt[pre[i-n]%m]--;
            ans += cnt[pre[i]%m];
        }
    }
    cout << ans;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值