【NOIP2011】选择客栈

这个题据说是水题,有很多种算法
算法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 >>>>>> 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}


 

posted on 2012-11-03 20:45 Cool Wings 阅读(626) 评论(0)  编辑 收藏 引用 所属分类: NOIP


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜