BC一周年练习赛

Souvenir

 
 Accepts: 901
 
 Submissions: 2743
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 262144/262144 K (Java/Others)
Problem Description
Today is the 1st anniversary of BestCoder. Soda, the contest manager, wants to buy a souvenir for each contestant. You can buy the souvenir one by one or set by set in the shop. The price for a souvenir is $p$ yuan and the price for a set of souvenirs if $q$ yuan. There's $m$ souvenirs in one set. There's $n$ contestants in the contest today. Soda wants to know the minimum cost needed to buy a souvenir for each contestant.
Input
There are multiple test cases. The first line of input contains an integer $T$ $(1 le T le 10^5)$, indicating the number of test cases. For each test case: There's a line containing 4 integers $n, m, p, q$ $(1 le n, m, p, q le 10^4)$.
Output
For each test case, output the minimum cost needed.
Sample Input
2
1 2 2 1
1 2 3 4
Sample Output
1
3
Hint
For the first case, Soda can use 1 yuan to buy a set of 2 souvenirs. For the second case, Soda can use 3 yuan to buy a souvenir.

有点贪心的意味,整套买省钱的尽量整套买,不能整套买的,看一整套与单个买哪个省钱。然而终测没过,然后交,并没有终测数据。。。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

int main()
{
      int T;
      cin >> T;
      int n, m, p, q;
      int ans;
      while(T--) {
            ans = 0;
            cin >> n >> m >> p >> q;
            int zu = n / m;
            int yu = n % m;
            if(zu == 0) {
                  ans = min(yu*p, q);
            } else {
                  if(yu == 0) {
                        ans = min(zu * q, n * p);
                  } else {
                        ans = min(zu * q + yu * p, min((zu + 1)* q , n * p));
                  }
            }
            cout << ans << endl;
      }
      return 0;
}
View Code

Hidden String

 
 Accepts: 437
 
 Submissions: 2174
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 262144/262144 K (Java/Others)
Problem Description

Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string ss of length nn. He wants to find three nonoverlapping substrings s[l_1..r_1]s[l1​​..r1​​], s[l_2..r_2]s[l2​​..r2​​], s[l_3..r_3]s[l3​​..r3​​] that:

  1. 1 le l_1 le r_1 < l_2 le r_2 < l_3 le r_3 le n1l1​​r1​​<l2​​r2​​<l3​​r3​​n

  2. The concatenation of s[l_1..r_1]s[l1​​..r1​​], s[l_2..r_2]s[l2​​..r2​​], s[l_3..r_3]s[l3​​..r3​​] is "anniversary".

Input

There are multiple test cases. The first line of input contains an integer T(1 le T le 100)(1T100), indicating the number of test cases. For each test case:

There's a line containing a string s(1 le |s| le 100)(1s100) consisting of lowercase English letters.

Output

For each test case, output "YES" (without the quotes) if Soda can find such thress substrings, otherwise output "NO" (without the quotes).

Sample Input
2
annivddfdersewwefary
nniversarya
Sample Output
YES
NO
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char str[110];
char const s[] = "anniversary";
int vis[110];
int len, h;
bool dfs(int a, int b) {
      h++;
      int i, j, k;
      for(i = a; i < len; ++i) {
            k = b;
            if(str[i] == s[k]) {
                  k++;
                  for(j = i+1; j < len; ++j) {
                        if(str[j] != s[k])
                              break;
                        k++;
                  }
                  if(s[k] == '' && h<=3)
                        return true;
                  if(dfs(j, k)) {
                        return true;
                  }
            }
      }
      h--;
      return false;
}

int main() {
      int T;
      scanf("%d%*c", &T);
      while(T--) {
            gets(str);
            len = strlen(str);
            h = 0;
            if(dfs(0, 0))
                  cout << "YES" << endl;
            else
                  cout << "NO" << endl;
      }
      return 0;
}
View Code
原文地址:https://www.cnblogs.com/ya-cpp/p/4677676.html