周五场(1) Q+周五场(2) E~H

牛牛玩平板
之前读假题了,重新讲述一下题意:
有n个图形,我们要将它两两合并,例如x、y合并后的图形为x+y,贡献值增加x*y。
问最终合并成一个图形能最多获得的多少贡献值?

一个贪心的假题:

结论:不管怎么合并,贡献值都是一样的。因为乘法分配律。

证明:假设n=4,图形是b1,b2,b3,b4.
1、一种合并方法:把b1b2合并,再接着这一堆继续合并,后面的每次合并都会用到b1b2所在的一堆。
那么贡献值ans=(b1*b2)+(b1+b2)*b3+(b1+b2+b3)*b4;
转化一下就是:ans=b1b2+b1b3+b1b4+b2b3+b2b4+b3b4;

2、还有一种合并方式是, 先把b1b2合并,再把b3b4合并,最后把这两堆合在一起。
ans=b1*b2+b3*b4+(b1+b2)*(b3+b4);
转化一下就是:ans=b1b2+b1b3+b1b4+b2b3+b2b4+b3b4;

现在可以观察到,ans与合并顺序没有关系,因此对于第三种合并方式(第一种与第二种合并方式结合),贡献值ans的结果没有影响。解决这道题,显然第一种合并方式好写代码。

参考代码:

#include
using namespace std;
int n,b[101];
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
    }
    int ans=0,x=b[0];
    for(int i=1;i<n;i++)
    {
        ans+=x*b[i];
        x+=b[i];
    }
    cout<<ans<<'\n';
}

素数判断

#include
using namespace std;

int isprime(int x)//返回0说明不是素数,反之是素数
{
    if(x<2)return 0;
    if(x==2)return 1;//这里需要特殊判断
    
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int T;
    cin>>T;
    for(int i=0;i<T;i++)
    {
        int n;
        cin>>n;
        int p=isprime(n);
        if(p==0)cout<<"No"<<"\n";
        else cout<<"Yes"<<"\n";
    }
}

好数

#include
using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int l,r;
        cin>>l>>r;
        
        int ans=0;
        for(int i=l;i<=r;i++)
        {
            int x=i/100;//百位
            int y=i/10%10;//十位
            int z=i%10;//个位
            
            int num=x*y;
            if(num%10==z)//num的个位
            {
                ans++;
            }
        }
        cout<<ans<<"\n";
    }
}

字符统计
报以丝~,这个题超纲了。或者说我的题解超纲了。

代码是不是很短,那是因为用了stl的一个容器set。
set是集合,集合具有唯一性,说明它不会重复,例如我把1放进set里,我再放一个1进去,set并不会出现两个1,因为已经有一个1在集合里啦~。它会自动判断,没有就放,有就不放。

#include
using namespace std;

int main()
{
    string s;
    cin>>s;
    
    set<char>st;//定义一个set,取名叫st
    for(int i=0;i<s.size();i++)
    {
        st.insert(s[i]);//把每个字符都放到set里
    }
    cout<<st.size();//看看set里面装了多少个字符
}

BFS

语言题,学习一下。

#include
using namespace std;

int main()
{
    string s;
    cin>>s;
    
    for(int i=0;i+2<s.size();i++)//i+2
    {
        if(s[i]=='B'||s[i]=='b')
        {
            if(s[i+1]=='o'||s[i+1]=='O')
            {
                if(s[i+2]=='b'||s[i+2]=='B')
                {
                    cout<<i;return 0;
                }
            }
        }
    }
    cout<<-1;
    return 0;
}

你可能感兴趣的:(非常愿意分享给大家的,算法)