标签:
2 1 2 2 1 1 2 3 4
1 3HintFor 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 ;
}
2 annivddfdersewwefary nniversarya
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 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
BestCoder 1st Anniversary--1001,1002解题
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/47085701