通师高专科技创新社周赛Round 10 题解

嘿嘿,大家好,我是一名大佬(蒟蒻),这次给大家来带本次通师高专科技创新社周赛Round 10 的题解,可能写的很棒(不是特别好)请大家谅解(快夸夸我)。

P1150 Peter 的烟

传送门:Peter 的烟 - 洛谷

思路:

设最终Peter抽到了x根烟,则其中(x-n)根烟都是用烟蒂换来的,而由于Peter最终能抽x根烟,所以他自始至终共拥有过x个烟蒂。能明白不?

明白了这一点,再想一个细节:实际上Peter抽到的最后一根烟的烟蒂是不能用来换烟的——所以实际可能用来换烟的烟蒂只有(x−1)个。

列出关于换来的烟的数量的方程:

 为了解出xx的值,我们解这个方程(这个你应该会叭!);这才得到了结果式:

 下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;

signed main()
{
    int t,n;
    cin>>t>>n;
    cout<<t+(t-1)/(n-1);
    return 0;
}

P1897 电梯里的爱情

传送门:电梯里的爱情 - 洛谷

思路:因为题目中明确表明开始是从0层开始的,所以设a[0]为0;然后输入数组在进行一个从小到大排序最大程度减少一上一下需要的开门时间,这样就可以用(a[i]-a[i-1])*6+5+1;如果a[i]==a[i-1]那么就减去5;因为同一楼层不需要开门时间。最后用a[t]*4算出回到0层需要多久即可。

下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;
int a[100005];
signed main()
{
    int t;
    cin>>t;
    a[0]=0;
        for(int i=1;i<=t;i++)
        {
            cin>>a[i];
        }
        sort(a,a+t+1);
        int sum=0;
        for(int i=1;i<=t;i++)
        {
            sum+=(a[i]-a[i-1])*6+5+1; 
            if(a[i]==a[i-1])
            {
                 sum-=5;
            }
        }
        sum+=a[t]*4;
        cout<<sum;
        return 0;
}

P1765 手机

传送门:手机 - 洛谷

思路:把手机键盘上所有按键从a-z的顺序需要每个需要按几下存入数组,再利用s[i]-'a',来调用数组内的值,sum叠加即可。

下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;
int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
signed main()
{
    string s;
    getline(cin,s);
    int len=s.size();
    int sum=0;
    for(int i=0;i<len;i++)
    {
            if(s[i]>='a'&&s[i]<='z')
            {
                    sum+=num[s[i]-'a'];
                }
                if(s[i]==' ')
                {
                        sum++;
                }
        }
        cout<<sum;
        return 0;
}

P2525 Uim的情人节礼物·其之壱

传送门:Uim的情人节礼物·其之壱 - 洛谷

思路:可以直接调用STL库的一个关于字典序的函数prev_permutation和next_permutation这两个分别是比当前字典序小一点和大一点,如果当前字典序已经是最小或者最大,他的返回值是0;所以这题if判断是否成立即可。

下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;
int a[100];
signed main()
{
    int t;
    cin>>t;
        for(int i=0;i<t;i++)
        {
                cin>>a[i];
        }
        if(prev_permutation(a,a+t)==1)
        {
                for(int i=0;i<t;i++)
                {
                        cout<<a[i]<<" ";
                }        
        }
        else
        {
                cout<<"ERROR";
        }
        return 0;
}

由于某些不可抗力这题被删除了,所以大家就当了解一下吧。

P3817 小A的糖果

传送门:小A的糖果 - 洛谷

思路:首先我们可以把这几个糖果盒分对来讨论; 先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下x个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢? 首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第1个/和第3个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量。所以我们要尽量吃掉第二个里的糖果。 处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了。

下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;
int a[100005];
signed main()
{
    int t,n;
    cin>>t>>n;
	for(int i=0;i<t;i++)
	{
		cin>>a[i];
	}
	int sum=0;
	if(a[0]>n)
	{
		sum+=a[0]-n;
		a[0]=n;
	}
	for(int i=1;i<t;i++)
	{
		if(a[i]+a[i-1]>n)
		{
			sum+=a[i]+a[i-1]-n;
			a[i]=n-a[i-1];
		}
	}
	cout<<sum;
	return 0;
}

P3926 SAC E#1 - 一道不可做题 Jelly

传送门:SAC E#1 - 一道不可做题 Jelly - 洛谷

思路:

如果 a > c,答案是 a+⌊x r⌋。

如果 a = c,有两种情况: 如果 x≤q,答案是 c。 如果 x > q,答案是 c+⌊(x−q) / r ⌋。

如果 a < c,有三种情况: 如果 x≤ (c−a)p,答案是 a+⌊x /p⌋。 如果 (c−a)p≤x≤ (c−a)p+q,答案是 c

如果 x > (c−a)p+q,答案是 c+⌊(x−(c−a)p−q) / r ⌋

下面附上代码:

#include<iostream>
#include<stdio.h>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#define int long long int
using namespace std;

signed main()
{
    int a,c,p,q,r,x;
    cin>>a>>c>>p>>q>>r>>x;
    while(a<c)
    {
        if(x>=p)
        {
            x-=p;
            a++;
        }
        if(x<p)
        {
             cout<<a;
             return 0;
        }
    }
    if(x<q)
    {
        cout<<a;
        return 0;
    }
    cout<<a+(x-q)/r;
    return 0;
}

嘿嘿嘿,完美谢幕,感谢大家的浏览,可以点个关注谢谢哟。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值