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

There‘s a line containing 4 integers n,m,p,q (1≤n,m,p,q≤104).

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. 1≤l1≤r1<l2≤r2<l3≤r3≤n

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 (1≤T≤100),
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 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 02:38:58

BestCoder 1st Anniversary--1001,1002解题的相关文章

BestCoder 1st Anniversary ($) 1001 Souvenir

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 cont

BestCoder 1st Anniversary($) 1003 Sequence

题目传送门 1 /* 2 官方题解: 3 这个题看上去是一个贪心, 但是这个贪心显然是错的. 4 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的k(k>2), 使得(m-k)mod6=0即可. 5 证明如下: 6 3n(n-1)+1=6(n*(n-1)/2)+1, 注意到n*(n-1)/2是三角形数, 任意一个自然数最多只需要3个三角形数即可表示. 7 枚举需要k个, 那么显然m=6(k个三角形数的和)+k, 由于k≥3, 只要m?k是6的倍数就一定是有解的

hdu 5311 Hidden String (BestCoder 1st Anniversary ($))(深搜)

http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1499    Accepted Submission(s): 534 Problem Description Today is the 1st anniversar

BestCoder Round #1 1001 &amp;&amp; 1002 hdu 4857 4858

hdu 4857 逃生 第一题是拓扑排序,不是按照字典序最小输出,而是要使较小的数排在最前面..赛后弄了好久,才比较明白,我一直以为 反向建图,i从1到n,开始深搜dfs( i ),对i点的边,由小到大继续搜一下,同时标记搜过的数,搜过之后就不再搜,搜到底之后ans[cnt++] = u;这样顺序输出就是答案,后来经过超哥指点,才明白深搜贪心是错的.只有 反向建图,用优先队列把较大的数尽量排在前面,然后反序输出才是正解.. 1 #include<iostream> 2 #include<

BestCoder 1st Anniversary ($) 1002.Hidden String

Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 问题描写叙述 今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为的字符串. 他想要知道是否能找到的三个互不相交的子串, , 满足下列条件: 1. 2. , , 依次连接之后得到字符串"anniversary". 输

BestCoder 1st Anniversary

problem 1001 Souvenir Accepts: 901 Submissions: 2743 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 问题描述 今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p元, 同时也可以花q元购买纪念品套装, 一个套装里有mm个纪念品. 今天总共有nn个参赛者, Soda想

BestCoder 1st Anniversary ($) 题解

Souvenir 问题描述 今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p元, 同时也可以花q元购买纪念品套装, 一个套装里有m个纪念品. 今天总共有n个参赛者, Soda想要知道最少需要花多少钱才可以给每个人都准备一个纪念品. 输入描述 输入有多组数据. 第一行有一个整数T (1≤T≤105), 表示测试数据组数. 然后对于每组数据: 一行包含4个整数 n,m,p,q (1≤n,m,p,q≤104). 输出描述 对于每组数据输

BestCoder 1st Anniversary 1002-1005

1002 Hidden String 这个题怎么暴力怎么搞就好了. 可以枚举最长匹配前缀, 和最长匹配后缀, 中间暴力for. 1 /*Author :usedrose */ 2 /*Created Time :2015/7/25 19:05:28*/ 3 /*File Name :2.cpp*/ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <sstream

BestCoder 1st Anniversary ($) Hidden String(深搜)

题意:给一个字符串s,问s中先后出现的三个子串是否能组成"anniversary" 解析:深搜,搜的层次小于等于三而且找到完整字符"anniversary"即正确,否则错误   #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 1e6; char s[1