AcWing第 80 场周赛

末尾字母

给定一个由大小写字母、空格和问号组成的字符串。

请你判断字符串中的最后一个字母是否是元音字母。

我们认为元音字母共有 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,要求:

  1. x≥n
  2. x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
  3. 满足前两个条件的前提下,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 个完全相同的白色棋子。

请你将所有棋子摆成一排。

在所有棋子都摆放好后,需满足:

  1. 不得有超过 k1k1 (即大于 k1k1)个黑色棋子连续相邻的排在一起。
  2. 不得有超过 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;   
}
 

猜你喜欢

转载自blog.csdn.net/GeekAlice/article/details/128167055