补题-2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(重现赛)


总结这次训练赛,ioi赛制,刚开始打的时候在几道题上死磕,简单题复杂化,整个人脑子是混的,不知道自己在写什么。最后一点时间才开始骗分,总体来说,这次打的很不好。最后就写才出来三道。

B Komorebi的数学课

B-Komorebi的数学课

思路

这就是一道简单的快速幂模板。

代码
#define int long long
void pp(int a,int b,int c)
{
    int res=1;
    while(b!=0){
        if(b&1) res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    cout<<res%p<<endl;
}
signed main()
{
    int n;
    cin>>n;
    pp(n,n,n+2);
}

C 次佛锅

C-次佛锅
这道题比赛的时候写太复杂了

思路

1.首先注意,要吃的菜出现的次数不止一次
2.处理好第一行输入的数据(输入中含有空格,所以我们如果要读取一行字符时不能用cin)
我这里学习到其他宝子的想法,用stringstream输入流来写
当我们使用>>读取stringstream时,他会以空格来分割字符

代码
#include<bits/stdc++.h>
using namespace std;
map<string,int> pp;
signed main()
{
    string s;
    getline(cin,s);//读取一整行
    stringstream sin;
    sin<<s;//转换成输入流
    string a;
    int b;
    while(sin>>a>>b)//每次读取菜名及数量
    {
        pp[a]+=b;
    }
    int n;
    cin>>n;
    while(n--)
    {
        string q;
        cin>>q;
        cout<<pp[q]<<endl;
    }
}

D Setsuna的K数列

D-Setsuna的K数列

思路

在这里插入图片描述

我们发现可以将n用二进制表示,将其表示的二进制转化为k进制即为答案。

代码
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int mod=1e9+7;
signed main()
{
	int n,m;
    cin>>n>>m;
    int t=n;
    string s;
    while(t)
    {
        if(t&1) s+='1';//奇数二进制最后位为1,偶数为0
        else s+='0';
        t/=2;
    }
    int res=1;
    int ans=0;
    for(int i=0;i<s.size();i++)
    {
        int num = s[i]-'0';
        ans=(ans+num*res) % mod;
        res=res*m%mod;
    }
    cout<<ans<<endl;
    
}

G天气预报

G-天气预报

题意

1.我们要注意到有一天都不选的可能,所以我们最后的结果要考虑是否加1
2.当我们在遍历的过程中,如果选择的天气在 i 处满足条件了,那么往后不过什么天气都肯定满足。所以我们可以直接用n-i去优化计算。(比如题目样例当i=1时 ‘0’和‘1’均满足,那么选择[1,n(n>=1)]总共有5-1种)
3.类似滑动窗口;利用双指针,右指针扩大窗口去满足题目条件,左指针去缩小窗口。

代码
#include<bits/stdc++.h>
using namespace std;
#define  int  long long 
signed main()
{
	int n,a,b;
    cin>>n>>a>>b;
    string s;cin>>s;
    int ans=0;
    int x=0,y=0;
    if(a+b==0) ans++;
    for(int i=0,j=0;i<s.size();i++)
    {
        if(s[i]=='1') x++;
        else y++;
        while(x>=b&&y>=a&&j<=i)
        {
            ans+=(n-i);
            if(s[j]=='0') y--;
            else x--;
            j++;
        }
    }
    cout<<ans<<endl;
}

L-剪绳子

L-剪绳子

思路

这道题其实并不难,直接暴力,但比赛的时候并没有开这道题。

1.计算时要注意定义首尾位置为0.0,10.0
2.用set去储存减去的绳子坐标

代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    set<double> s;
    while(t--)
    {
        char c;double f;
        cin>>c>>f;
        if(c=='C')
        {
            s.insert(f);
        }
        else 
        {
            double a=0,b=10.0;
            for(auto p:s)
            {
                if(f<p) {b=p;break;}
                a=p;
               
            }
            printf("%.5f\n",b-a);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值