目录
A题
给你一个字符串,问你里面的字符是元音多还是辅音多。
思路:枚举字符串,元音ans++,辅音ans--,最后判断ans正负即可。
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
const int N=2000;
int main()
{
// freopen("input.txt","r",stdin);
int n;
cin>>n;
while(n--)
{
string s;
cin>>s;
cout<<s<<endl;
int ans=0;
for(int i=0;i<s.length();i++)
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u') ans++;
else ans--;
if(ans>0) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
return 0;
}
B题
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
const int N=2000;
int main()
{
// freopen("input.txt","r",stdin);
int n;
cin>>n;
for(int j=1;j<=n;j++)
{
int g,p;
cin>>g>>p;
printf("Team #%d\n",j);
printf("Games: %d\n",g);
printf("Points: %d\n",p);
printf("Possible records:\n");
for(int i=100;i>=0;i--)
{
int x=i;
int y=p-3*x;
if(x+y<=g&&x+y>=0&&y>=0&&y<=g)
{
printf("%d-%d-%d\n",x,y,g-x-y);
}
}
puts("");
}
return 0;
}
C题
贪心做法,每次让青蛙跳最远,如果最远的那一个方块不能着陆,则往后退,直到能着陆为止,如果退回了原地,则青蛙不能到达终点。
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstring>
using namespace std;
const int N=2000;
int main()
{
// freopen("input.txt","r",stdin);
int n;
cin>>n;
for(int k=1;k<=n;k++){
int c,d;
cin>>c>>d;
string s;
cin>>s;
printf("Day #%d\n",k);
cout<<c<<" "<<d<<endl;
cout<<s<<endl;
int ans=0;//记录步数
d++;
for(int i=0;i<c;)
{
int j=i+d;
ans++;
if(j>=c-1)
{
break;
}
while(s[j]=='X')
{
j--;
}
if(j==i)
{
ans=0;
break;
}
i=j;
}
cout<<ans<<endl;
puts("");
}
return 0;
}
I题
题意:给你一串数,让你挑选一些。规则是:当下标为k时,你最多只能挑k/2个(注意,这对1-n每一个数都要满足)。
eg:前1个数你能挑这一个,前2个数你能挑一个,前3个数你能挑一个,前4个数你能挑2个,前5个数你能挑2个,前6个数你能挑3个...
当时看题的时候,看成找连续n/2个数了,英语不好、不认真按主谓宾来看是罪过啊。。
思路:定义一个二维数组f,f[i][j]储存从1~i中选出符合题意的j个最大值的和。注意最大的前提是要满足条件的。
代码的话是抄别人的,能看懂,但是不知道原理,就这样凑合吧。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=550;
typedef long long ll;
int n;
int a[N];
int f[N][N];
int main()
{
// freopen("input.txt","r",stdin);
int t;
cin>>t;
for(int j=1;j<=t;j++)
{
printf("Spree #%d: ",j);
memset(a,0,sizeof a);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int ans=f[1][1]=a[1];
for(int i=2;i<=n;i++)
for(int j=1;j<=i/2;j++)
f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i]);
cout<<max(ans,f[n][n/2])<<endl;
}
return 0;
}
J题
题解:感觉这道题有3个坑点。
1、阶乘是很大的数,算不了几个就会爆long long。所以必须用对数代替阶乘来比较大小。
logn!=log1+log2+log3+...logn-1+logn.比较n!与m!的大小也就是比较logn!与logm!的大小,而比较logn!与logm!可以转化为比较log1+..+logn与log1+...logm的大小。
2、求对数什么的,最后的结果往往是小数,所以数组类型要改成double。
3、C和C++中double类型是不能直接比较的。详见博客https://blog.csdn.net/lwgkzl/article/details/79548882
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2510;
const double eps=1e-6;
typedef long long ll;
int n;
double fac[N];
int main()
{
// freopen("input.txt","r",stdin);
fac[0]=0;
for(int i=1;i<=2503;i++) fac[i]=fac[i-1]+log(i);
int t;
cin>>t;
for(int j=1;j<=t;j++)
{
printf("Case #%d: ",j);
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
double A=0,B=0,C=0;
int x;
for(int i=0;i<a;i++)
{
scanf("%d",&x);
A+=fac[x];
}
for(int i=0;i<b;i++)
{
scanf("%d",&x);
B+=fac[x];
}
for(int i=0;i<c;i++)
{
scanf("%d",&x);
C+=fac[x];
}
if(A>B+eps&&A>C+eps) cout<<"A"<<endl;
else if(B>A+eps&&B>C+eps) cout<<"B"<<endl;
else if(C>A+eps&&C>B+eps) cout<<"C"<<endl;
else cout<<"TIE"<<endl;
}
return 0;
}