目錄
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;
}