继上次的牛与问题,特此再做总结。
复述一下问题(还是简化版):
牛发明了一种语言,英文单词开头是元音字母的直接在后面加“cow”,不是的把最前面的单词移到最后再加“ow;
经过大神的指导之后,终于开窍的我写出了以下代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
string b;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;
if(b[0]=='a'||b[0]=='e'||b[0]=='i'||b[0]=='o'||b[0]=='u')
{
cout<<b<<"cow"<<endl;
}
else
{
for(int j=1;j<b.size();j++)
{
cout<<b[j];
}
cout<<b[0]<<"ow"<<endl;
}
}
return 0;
}
对于本代码的理解如下图;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
string b;//定义字符串;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;//输入A个字符串;
if(b[0]=='a'||b[0]=='e'||b[0]=='i'||b[0]=='o'||b[0]=='u')//b[0]是字符串第一个字母;
{
cout<<b<<"cow"<<endl;//开头是元音,即在结尾直接加“COW”;
}
else
{
for(int j=1;j<b.size();j++)//输出字符串中除第一个外的各个字母;
{
cout<<b[j];
}
cout<<b[0]<<"ow"<<endl;//把第一个字母放到末尾,并在最后加“OW”;
}
}
return 0;
}
对于恐怖服装这一题,鄙人做出了以下改动:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,s,a[1001000],ans=0;
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>a[i];//输入每头牛的长度;
}
for(int j=1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)//声明:这里的意思是K每次都是代表第J头牛后面的牛,避免了自己和自己,也避免了重复;
{
if(a[j]+a[k]<=s)//长度不大于服装长度,可选择的选法+1;
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
对于重复这一点,鄙人是看到一组数据后才想到的,源代码+原思想如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,s,a[10000],ans=0;
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(a[j]+a[k]<=s&&a[j]!=a[k])//这时,每种选法都被重复选中两次,所以后面ANS要除以2;
{
ans++;
}
}
}
cout<<ans/2<<endl;
return 0;
}
该代码有以下几点问题:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,s,a[10000],ans=0;//数组开的太小;
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(a[j]+a[k]<=s&&a[j]!=a[k])//假设一种特殊情况:当第J头牛和第K头牛长度相等时,K也不等于J,就少了一次;
{
ans++;
}
}
}
cout<<ans/2<<endl;
return 0;
}
又臭又长。。