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 ; }
版权声明:本文为博主原创文章,未经博主允许不得转载。