末尾字母
给定一个由大小写字母、空格和问号组成的字符串。
请你判断字符串中的最后一个字母是否是元音字母。
我们认为元音字母共有 6 个,分别为:A、E、I、O、U、Y(当然还有它们的小写)。
输入格式
一个由大小写字母、空格和问号组成的字符串。
保证问号在字符串中恰好出现一次,且一定出现在最后。
字符串中至少包含一个字母。
输出格式
如果字符串中的最后一个字母是元音字母,则输出 YES
,否则输出 NO
。
注意,我们问的是最后一个字母,而不是最后一个字符,空格和问号不算作字母。
数据范围
所有测试点满足,输入字符串的长度范围 [2,100]。
输入样例1:
Is it a melon?
输出样例1:
NO
输入样例2:
Is it an apple?
输出样例2:
YES
输入样例3:
Is it a banana ?
输出样例3:
YES
输入样例4:
Is it an apple and a banana simultaneouSLY?
输出样例4:
YES
第一个版本,可以先按照思路一步一步写。定义一个字符串a表示初次输入的那个字符串,需要包含空格输入所以我们使用getline。在这个while循环里提出字母的字符,并负值于字符串b。获取倒数第一个字母是否为,aeiouy。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a;
string b;
while(getline(cin,a))
{
int n=a.size();
int temp = 0;
for(int i=0;i<n;++i)
{
if(a[i]!=32){
b[temp]=a[i];
temp++;
}
}
//cout<<temp;
int dier = temp-2;
char two = b[dier];
//cout<<two;
if(two=='A'||two=='a'){
cout<<"YES"; return 0;
}
if(two=='E'||two=='e'){
cout<<"YES";return 0;
}
if(two=='I'||two=='i'){
cout<<"YES";return 0;
}
if(two=='O'||two=='o'){
cout<<"YES";return 0;
}
if(two=='U'||two=='u'){
cout<<"YES";return 0;
}
if(two=='Y'||two=='y'){
cout<<"YES";return 0;
}
//cout<<two;
cout<<"NO";
}
return 0;
}
在这个的基础上,做一些改进
#include <iostream>
using namespace std;
char ch,ans = ' ';
string s = "aoeiuy";
int main () {
while (cin >> ch) {
if (isalpha (ch)) ans = ch;
}
if (s.find (tolower (ans)) != -1) puts ("YES");
else puts ("NO");
return 0;
}
寻找数字
给定一个正整数 n,请你找到一个正整数 x,要求:
- x≥n
- x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
- 满足前两个条件的前提下,x 应尽可能小。
输入格式
一个正整数 n。
输出格式
一个正整数,表示 x。
数据范围
前 66 个测试点满足 1≤n≤5000。
所有测试点满足 1≤n≤109。
输入样例1:
4500
输出样例1:
4747
输入样例2:
47
输出样例2:
47
最开始想到的就是用打表,但是在acwing上肯定超时。
#include<bits/stdc++.h>
using namespace std;
int main()
{
for(int i=1;i<=1000000000;i++){
int s=0,f=0;
int t=i,ok=1;
while(t>0){
if(t%10==4)f++;
else if(t%10==7)s++;
else ok=0; t/=10;
}
if(s==f&&ok)cout<<" else if(n<="<<i<<")cout<<"<<i<<";\n";
}
}
摆放棋子
给定 n1n1 个完全相同的黑色棋子和 n2n2 个完全相同的白色棋子。
请你将所有棋子摆成一排。
在所有棋子都摆放好后,需满足:
- 不得有超过 k1k1 (即大于 k1k1)个黑色棋子连续相邻的排在一起。
- 不得有超过 k2k2 (即大于 k2k2)个白色棋子连续相邻的排在一起。
请问一共有多少种不同的摆放方法。
由于结果可能很大,你只需要输出对 108108 取模后的结果。
输入格式
共一行,包含 44 个整数 n1,n2,k1,k2n1,n2,k1,k2。
输出格式
输出满足要求的摆放方法数量对 108108 取模后的结果。
数据范围
前 44 个测试点满足 1≤n1,n2≤101≤n1,n2≤10。
所有测试点满足 1≤n1,n2≤1001≤n1,n2≤100,1≤k1,k2≤101≤k1,k2≤10。
输入样例1:
2 1 1 10
输出样例1:
1
输入样例2:
2 3 1 2
输出样例2:
5
输入样例3:
2 4 1 1
输出样例3:
0
定义状态f[i][j][k] 为前 i 个棋子,j 个白棋,最后填的是k ( 0 表示最后填黑,1 表示最后填白)其中aa 为枚举填的棋子数量,第一个式子推的是填白棋,第二个式子推的是填黑棋,答案就是 (f[n][n2][0]+f[n][n2][1])modp(f[n][n2][0]+f[n][n2][1])modp ,n 为总棋子个数,注意第一维要开两倍。
#include <bits/stdc++.h>
#define pc(c) putchar(c)
#define rep(a,b,c) for (int (a) = (b) ; (a) < (c) ; ++(a))
using namespace std;
using ll = long long ;
using pii = pair<int,int> ;
const int maxn = 210 ,p = 1e8;
int f[maxn][maxn][2];
int main(){
int n1,n2,k1,k2,n;
cin >> n1 >> n2 >> k1 >> k2 ;
f[0][0][0] = f[0][0][1] = 1;
n = n1 + n2 ;
for (int i = 1 ; i <= n ; ++ i ){
for (int j = 0; j <= n2 && j <= i ; ++ j){
if ( i > n1 + j ) continue ;
for (int a = 1 ; a <= j && a <= k2 ; ++ a) {
f[i][j][1] = (f[i][j][1] + f[i - a][j - a][0]) % p ;
}
for (int a = 1 ; j + a <= i && a <= k1 ; ++ a ){
f[i][j][0] = (f[i][j][0] + f[i - a][j][1]) % p;
}
}
}
cout << (f[n][n2][0] + f[n][n2][1]) % p;
return 0;
}