牛牛玩平板
之前读假题了,重新讲述一下题意:
有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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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里面装了多少个字符
}
语言题,学习一下。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=0;i+2<s.size();i++)//i+2<s.size(),以防越界
{
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;
}