这个题据说是水题,有很多种算法
算法1 (朴素):
1、顺序检索每一个客栈。
2、对于颜色为k的客栈i,搜索在此之前后颜色同为k的客栈j。
3、搜索到以后查找区间[i,j]内消费要求小于等于p的客栈,搜索到则总结果数sum+1。
1
#include<iostream>
2
using namespace std ;
3
int 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>
2
using namespace std ;
3
int 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
}