BestCoder 1st Anniversary--1001,1002解题

Souvenir

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 713    Accepted Submission(s): 436


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   (1T105) , indicating the number of test cases. For each test case:

There's a line containing 4 integers  n,m,p,q   (1n,m,p,q104) .
 

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.


题目中有两种购买方式,p元1件,或者是q元m件,如果p*m <= q,那么每次都买一件肯定是最小的价格,结果为p*n

如果p*m >q 也就是说如果能买m件,那么花q的钱是优的,所以可以买n/m套,这个价格是便宜的,剩下的n-n/m*m件分两种情况,一种是买n-n/m*m件,一种是买一套,比较一下,选一个小的值。

不能用dp,TLE,,,,

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define INF 0x3f3f3f3f
int dp[10010] ;
int main() {
    int t , i , j , ans ,  n , m , p , q ;
    scanf("%d", &t) ;
    while( t-- ) {
        scanf("%d %d %d %d", &n, &m, &p, &q) ;
        if( p*m <= q ) {
            printf("%d\n", n*p) ;
        }
        else {
            i = n/m ;
            ans = i*q ;
            i = n-m*i ;
            if( i*p > q )
                ans += q ;
            else ans += i*p ;
            printf("%d\n", ans) ;
        }
    }
    return 0 ;
}

Hidden String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 900    Accepted Submission(s): 337


Problem Description
Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string  s  of length  n . He wants to find three nonoverlapping substrings  s[l1..r1] s[l2..r2] s[l3..r3]  that:

1.  1l1r1<l2r2<l3r3n

2. The concatenation of  s[l1..r1] s[l2..r2] s[l3..r3]  is "anniversary".
 

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

There's a line containing a string  s   (1|s|100)  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
 


直接暴力,枚举对anniversary的两个断点,去和str串匹配

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int len ;
char str[110] ;
char s[20] = "anniversary" ;
int f(int x,int y) {
    int i , j , k , flag = 0 ;
    for(i = 0 ; i < len ; i++) {
        if( flag == 0 ) {
            for(j = 0 ; j <= x ; j++) {
                if( str[i+j] != s[j] ) break ;
            }
            if( j > x ) {
                flag = 1 ;
                i = i+j-1 ;
            }
        }
        else if( flag == 1 ) {
            for(j = x+1 ; j <= y ; j++) {
                if( str[i+j-x-1] != s[j] ) break ;
            }
            if( j > y ) {
                flag = 2 ;
                i = i+j-x-1-1 ;
            }
        }
        else if( flag == 2 ) {
            for(j = y+1 ; j <= 10 ; j++) {
                if( str[i+j-y-1] != s[j] ) break ;
            }
            if( j > 10 ) {
                return 1 ;
            }
        }
    }
    return 0 ;
}
int main() {
    int t , i , j ;
    scanf("%d", &t) ;
    while( t-- ) {
        scanf("%s", str) ;
        len = strlen(str) ;
        for(i = 0 ; i < 11 ; i++){
            for(j = i+1 ; j < 10 ; j++) {
                if( f(i,j) ) break ;
            }
            if( j < 10 ) break ;
        }
        if( i < 11 )
            printf("YES\n") ;
        else
            printf("NO\n") ;
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值