这个题据说是水题,有很多种算法
算法1 (朴素):
1、顺序检索每一个客栈。
2、对于颜色为k的客栈i,搜索在此之前后颜色同为k的客栈j。
3、搜索到以后查找区间[i,j]内消费要求小于等于p的客栈,搜索到则总结果数sum+1。
1#include<iostream>
2using namespace std ;
3int main()
4{
5 long n, k, p ;
6 long color[200000], cost[200000] ;
7 //freopen( "2.in", "r", stdin ) ; freopen( "2.out", "w", stdout ) ;
8 cin >>n >>k >> p ;
9 for ( long i = 0; i < n; i++ ) cin >>color[i] >>cost[i] ;
10 long ans = 0 ;
11 for ( long i = 0; i < n-1; i++ )
12 for ( long j = i+1; j < n ; j++ )
13 if ( color[i]== color[j] )
14 {
15 long temp = 0 ;
16 for ( long cafe = i; cafe <= j && temp == 0 ; cafe++ )
17 if ( cost[cafe] <= p ) temp = 1 ;
18 ans += temp ;
19 }
20 cout << ans ;
21 return 0 ;
22}
预期得分40~60
算法二:
当然是DP
动态规划,设f[i,j]为前i个客栈中色调为j的可行方案,s[i,j]为前i个客栈中可以与之后色调为j的客栈搭配的客栈数,即有s[i,j]个客栈的色调为j,且该客栈与第i个客栈之间有符合条件的咖啡店,v[i]为第i个客栈的最低消费,c[i]为第i个客栈的色调a[i,j]为前i个客栈中色调为j的客栈的数目,则有
s[i,j] = ( v[i] <= p ) ? a[i,j] : s[i-1,j]
f[j] = ( c != j ) ? f[j] : f[j]+s[j]
代码:
1#include <cstdio>
2using namespace std ;
3int main()
4{
5 freopen( "2.in", "r", stdin ) ;
6 freopen( "2.out", "w", stdout ) ;
7 long n, m, p, i, j, ans, v = 0, c = 0 ;
8 long a[50] = {0}, s[50] = {0}, f[50] = {0} ;
9 scanf( "%ld%ld%ld", &n, &m, &p ) ;
10 for ( i = 1; i <=n; i++ )
11 {
12 scanf( "%ld%ld", &c, &v ) ;
13 if ( v <= p )
14 for ( j = 0; j < m; j++ ) s[j] = a[j] ;
15 for ( j = 0; j < m; j++ )
16 f[j] = ( c != j ) ? f[j] : f[j]+s[j] ;
17 a[c]++ ;
18 if ( v <= p ) s[c]++ ;
19 }
20 ans = 0 ;
21 for ( j = 0; j < m; j++ ) ans+= f[j] ;
22 printf( "%ld", ans ) ;
23 return 0 ;
24}