2009 Google Code Jam Round 1C 题解

等边三角形边N等分后不同凸六边形的个数 本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo有一个等边三角形,把每条边N(N如N=4时,有七个不同的凸六边形,如下图所示。 这是上次TC比赛中的一道题,个人觉得这道题是最有趣的也有最有难度的一道题,思索良久却始终不得要领。后来在高人的提示下终于有所进展,遂写下此文以作纪念。看到的朋友也可以在闲睱时间考考别人^_^。 阅读详情

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo

 

Google Code Jam 的题解暂时就只有这些了,ROUND2我选择了睡觉,暂时也没有时间做……

 

Problem A site: http://code.google.com/codejam/contest/dashboard?c=189252#s=p0

思路:贪心算法。如果字符串中有N个不同的字符出现,表示至少为N进制。对于同一个数来说,进制越小,数值越小,对于同一个长度的数来说,高位越小,数值越小。故我们贪心分配每个字符所代表的数值即可。

 

 
#include <map>
#include <cstdio>

int T;
char str [ 88 ];
int mp [ 129 ];
bool used [ 66 ];
int ans [ 88 ];

int main() {
    //freopen("A-large-practice.in", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf( "%d" , & T);

    for( int i = 0; i < T; ++ i) {
        scanf( "%s" , & str);
        int v = 1;
        for( int i = 0; i < 129; ++ i)
            mp [ i ] = - 1;

        memset( used , false , sizeof( used));
        int base = 1;
        for( int j = 0; str [ j ]; ++ j) {
            if( mp [ str [ j ] ] == - 1) {
                if( v) {
                    v = 0;
                    mp [ str [ j ]] = 1;
                    used [ 1 ] = true;
                } else {
                    for( int k = 0; k <= 64; ++ k) {
                        if( used [ k ] == false) {
                            used [ k ] = true;
                            mp [ str [ j ]] = k;
                            if( k > base)
                                base = k;
                            break;
                        }
                    }
                }
            }
        }
       
       
        for( int j = 0; str [ j ]; ++ j) {
            ans [ j ] = mp [ str [ j ]];
        }
        ++ base;
       
        unsigned long long tmp = 1;
        long long out = 0;
       
        for( int j = strlen( str) - 1; j >= 0; -- j) {
            out += tmp * ans [ j ];
            tmp *= base;
        }

        printf( "Case #%d: %lld /n " , i + 1 , out);

    }
    return 0;
}

 

Problem B site: http://code.google.com/codejam/contest/dashboard?c=189252#s=p1

思路:求二次函数的最小值,注意边界问题及为常函数或线性函数。对于某个时刻t,根据题中所经公式可以得到,坐标(x,y,z)只与t相关。由空间两点间距离可得到是关于t的二次函数y = ax^2 + bx + c (a ≥ 0)。如果a ≠ 0, 在 x = - b / (2a)取得极小值,如果x < 0,则在x = 0处取得极小值。如果a = 0,则为线性函数,易求得最近点。

 
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int T , n;
int main() {
    //double sigx, sigy, sigz, sigxx, sigyy, sigzz;
    //B-small-practice.in
    freopen( "B-large-practice.in" , "r" , stdin);
    freopen( "out.txt" , "w" , stdout);
    scanf( "%d" , & T);
    for( int i = 0; i < T; ++ i) {
        double sigx = 0 , sigy = 0 , sigz = 0 , sigxx = 0 , sigyy = 0 , sigzz = 0;
        int x , y , z , vx , vy , vz;
        scanf( "%d" , &n);
        for( int j = 0; j < n; ++ j) {
            scanf( "%d %d %d %d %d %d" , & x , & y , & z , & vx , & vy , & vz);
            sigx += x;
            sigy += y;
            sigz += z;
            sigxx += vx;
            sigyy += vy;
            sigzz += vz;
        }


        double a = 0 , b = 0 , c = 0;
        a = sigxx * sigxx + sigyy * sigyy + sigzz * sigzz;
        b = 2 * ( sigx * sigxx + sigy * sigyy + sigz * sigzz);
        c = sigx * sigx + sigy * sigy + sigz * sigz;
        double tmin;
        if( a == 0) {
            tmin = 0;
        } else {
            tmin = - b / ( 2 * a);
            if( tmin < 0)
                tmin = 0;
        }

        double dmin;
        dmin = a * ( tmin) * ( tmin) + b * tmin  + c;
        dmin /= (n * n);
        dmin = sqrt( dmin);

        printf( "Case #%d: %8lf %8lf /n " , i + 1 , dmin , tmin);

    }
}

 

Problem C site: http://code.google.com/codejam/contest/dashboard?c=189252#s=p2

思路:记忆化DP。对于要取得最优值,假设应该释放的排列为Q1, Q2, ……, Qn,我们在第一次分割后,1-P分解成二个子问题,1-(Q1-1)与(Q1+1)-P,这样就把问题分划为更小的问题,再递归进行求解,然而在递归的过程中,许多问题被重复计算,我们可以把己经计算出来的区间最小值记录下来,以后每次进行分割时,如果某个段己经求得最值就直接返回,否则进行递归查找。

 

 

 

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

int T;
int realse [ 101 ];
int P , Q;
map < pair < int , int > , int > dp;

int slove( int a , int b) {
    pair < int , int > pr( a , b);
    if( dp . find( pr) != dp . end())
        return dp [ pr ];

    int r = 0;
    for( int i = 0; i < Q; ++ i) {
        if( realse [ i ] >= a  && realse [ i ] <= b) {
            int tmp = (b - a) + slove( a , realse [ i ] - 1) + slove( realse [ i ] + 1 , b);
            if( ! r || tmp < r)
                r = tmp;
        }
    }
    dp [ pr ] = r;
    return r;
}

int main() {
    //freopen("C-large-practice.in", "r", stdin);
    //freopen("out.txt", "w", stdout);
    scanf( "%d" , & T);
    for( int i = 1; i <= T; ++ i) {
        scanf( "%d %d" , &P , & Q);
        for( int j = 0; j < Q; ++ j) {
            scanf( "%d" , & realse [ j ]);
        }
        sort( realse , realse + Q);
        dp . clear();
        int ans = slove( 1 , P);
        printf( "Case #%d: %d /n " , i , ans);


    }
    return 0;
}
【实战解析】SAP EWM与PP深度集成:从后台配置到前台物料流转的全链路设计 本文深入解析SAP EWM与PP深度集成的全链路设计,涵盖后台配置与前台物料流转的实战应用。通过两种集成模式(DPI与API)的选择策略、十二个关键后台配置步骤详解,以及PMR生成、PSA补货等前台演示,帮助企业实现生产计划与物料供应的高效协同,显著提升生产效率和库存周转率。 阅读详情

相关推荐

网易CodeWave智能生成应用实战:5分钟搞定库存管理系统(附详细配置截图)

本文详细介绍了如何利用网易CodeWave智能生成应用在5分钟内快速构建定制化库存管理系统。通过自然语言描述需求,无需编程即可生成包含产品管理、库存预警等核心功能的应用,并支持字段微调、业务流程注入等深度优化。文章附有详细配置截图,帮助用户高效实现数字化转型。

julia4scientist的博客 888

Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

我们开始分析 假设1-10  我们取3 和 5和 7    1 - 10 1-4   5  6-10     hanshu(1,10)=hanshu(1,4)+hanshu(6,10)+ (a[10]-a[1]-2)这部分是取5所能获得的 基本dp我们就找到了。通过记忆化dp来做 #include    #include    #include

Little_boy_z的博客 362

深入解析线性反馈移位寄存器(LFSR)的工作原理与实现

本文深入解析了线性反馈移位寄存器(LFSR)的核心原理与实现方法。通过生动的比喻和详细的步骤拆解,阐述了LFSR如何通过反馈多项式和移位操作生成伪随机序列,并对比了斐波那契型与伽罗瓦型两种硬件结构。文章还涵盖了LFSR在数字电路测试、通信扰码及快速伪随机数生成等关键应用场景,同时指出了其在密码学中的局限性,并提供了Python和C语言的高效实现代码示例。

weixin_29007243的博客 545

2009Round1C C

#define MAX_N 1000 #define INF 0x3f3f3f3f int P,Q,A[MAX_N]; //释放(i~j) 所需要的金币 int dp[MAX_N][MAX_N]; void solve(){ A[0] = 0; A[Q+1] = P + 1; //初始化 for(int i = 0;i < Q;

fisty 709

WPS文档编辑时空行问题解决方案

本文详细介绍了如何解决WPS文档编辑时空行的问题,从问题描述与分析、解决方案详解到操作示例与注意事项等多个方面进行了全面阐述。通过本文的介绍和指导,用户可以快速定位问题根源并采取有效措施进行解决,从而提升文档编辑效率和美观性。未来,随着WPS软件的不断升级和优化,相信会有更多便捷高效的功能被添加到软件中。同时,用户也需要不断学习和探索新的操作技巧和方法,以适应不断变化的办公需求。希望本文能够为广大WPS用户提供有益的参考和帮助,共同推动办公效率的提升和发展。

mmoo_python的博客 1244

告别有线:用PVE直通无线网卡,打造一台真正的‘无线’Win10软路由/测试机

本文详细介绍了如何通过PVE直通无线网卡技术,构建全无线Win10软路由或测试机。从硬件选型、PVE环境配置到PCIe和USB双模直通技术,逐步指导实现Wi-Fi AP和蓝牙连接功能,为家庭实验室和小型办公环境提供灵活高效的网络解决方案。

weixin_28683689的博客 587

2009_Round_1C_C

//bribe the prisoners //http://blog.youkuaiyun.com/lizo_is_me/article/details/43735509 //compute the sub item first , then left_cost+right_cost+item(i->j)-1 =>cost of bribe i->j //dp+iterate //bribe the

qq_33889075的博客 372

UFS逻辑单元管理

介绍UFS 逻辑单元管理和配置

m0_51720747的博客 1949

挑战2.7.3 Round 1C 2009 C. Bribe the Prisoners 区间dp

题目链接:https://code.google.com/codejam/contest/189252/dashboard#s=p2题意:题解:区间dp dp[i][j] 表示释放a[i]~a[j] 【不包含两端的囚犯】所需要的最小费用 枚举其中最先释放的最小费用 则 dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]) {i+1<=k<=j-1}代码:#inc

yxg_123的博客 279

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

Matlab安装硬件支持包、simulink离线安装硬件支持包安装,离线安装ESP32、stm32等安装包,Are you up-to-date on SoftWare Maintenance?

注意:如果提示出现“没有可从此位置安装的兼容支持包后,这个问题,请查看步骤5,是不是没有按照步骤5进行操作.一般情况下出现“没有可从此位置安装的兼容支持包”后,重新安装选择了默认路径就可以成功。如果不是很清楚,直接安装在默认的文件夹下面,即使这个文件夹下没有matlab相关的文件夹,也要这么下载,没有为什么,切记尽量按默认路径安装,更改下载的路径不成功,别怪我没提醒。:下载到哪里非常重要,如果下载的不是默认的路径下,就需要将其中这个的是这个archives文件夹,连同其他文件一并要复制出来,拷贝到。

pvmsmfchcs的博客 1746

Google code jam 2008 Round 1A(c.Numbers)题解

   题目是计算(3+sqrt(5))^n的小数点前三位数,不足三位补0,正整数n的最大值为20亿。   http://code.google.com/codejam/contest/dashboard?c=agdjb2RlamFtchALEghjb250ZXN0cxiE2QUM   经过两天的努力,终于把这道题搞明白了,为了方便后人的学习现将算法整理下来。

superhackerzhang的专栏 1510

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 652

ZJOI round1游记

Day 0 到镇海报道了 大佬们太多了……话说镇海的晚饭还真好吃啊…… 听说某人要咱去找bwh……不过咱和他也不是很熟啊……还是算了吧……(才不是因为嫌麻烦懒得去呢) 晚上吃完晚饭之后在镇海校园里参观了一下话说居然还有个林则徐纪念馆,惹得咱诗兴大发 宾馆里的空调似乎坏掉了,十摄氏度的空调吹得我浑身是汗 本来想写一下昨晚\(AGC\)的题解的,(毕竟我昨晚本来想早点睡觉所以没打却因为某个家伙搞到十...

weixin_34233679的博客 150

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

GCJ 2009 Round 1C C (Bribe the Prisoners)

题意:   有P个相邻的牢房(序号1,2,…,P),每个牢房中关押着犯人一名 现在要释放Q个牢房中的犯人(序号给出),释放后牢房为空 每次释放一名时需要依次向左向右给其他牢房犯人每人一枚金币直到遇到空牢房为止   可以按照任何顺序释放犯人,输出所需最小金币数。   思路: 为方便理解,预处理出序号为0和序号为P+1的空牢房。 可以想到,如若释放了序号i(0   故可以用动态

SummerorWinter的博客 940

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

google code jam 2009 round1 c

链接:https://code.google.com/codejam/contest/189252/dashboard#s=p2 题意:释放一个犯人就需要给他身边的犯人各一个金币,一直扩展到空牢房或者是墙。给了你几个需要释放的犯人的序号,问采用什么样的顺序释放能够使得所花的金币数量最少。 分析: 可以将问题进行分解,释放一个所需的金币就是1)释放这个人所需的,2)释放左边全部犯人所需的,3)释

liujc_的专栏 689

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

google codejam 2009 Qualification Round Problem C code

#include #include #include using namespace std;const string b("welcome to code jam");//const string b("a");const int MAXLEN = 501; const int m = b.length();int n;string a;int cnt[MAXLEN][20];v

yllfever的专栏 562

记忆化搜搜——Code Jam 2009 Round 1C #C Bribe the Prisoners

题目链接: https://codejam.withgoogle.com/codejam/contest/189252/dashboard#s=p2 题意:给出一个长度为P的监狱,每个位置一个人,现在要释放Q个人,没释放一个人,要给他左右两边的连续有人的位置的人贿赂一枚金币,求释放这Q个人最少需要花费多少金币 分析:初看这题和哈弗吗路径很像,其实不是,因为每释放一个人,相当于少了一个单位的长度,

FeBr2的博客 659

2017Google Codejam round1c Problem A. Ample Syrup

Problem The kitchen at the Infinite House of Pancakes has just received an order for a stack of K pancakes! The chef currently has N pancakes available, where N ≥ K. Each pancake is a cylinder, a

youngkl博客 1089

Dancing Links 算法

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluoDancing Links是解决完美覆盖问题的算法,我不得不说,这是我所见过的最优美的算法。难怪Donald E.Knuth为其取名为Dancing Links。大致思想是把问题转化为一个01矩阵,选取一些列,使每列都包含且只含一个1。采取的数据结构是双向十字链表结构。Donald

MasterLuo (Stay Hungry, Stay Foolish) 4295

欧几里得算法及其扩展

本文内容遵从CC版权协议 转载请注明出自:    http://blog.youkuaiyun.com/masterluo最大公约数的求法中最过著名的莫过于欧几里得辗展相除法,它有两种形式(递归与非递归,其实是一样的,任何递归都可以写成非递归),下面看看它的C++代码:/***求a,b最大公约数***/long long gcd(long long a, long long b) {       

MasterLuo (Stay Hungry, Stay Foolish) 2625

解方程: x+y=x|y

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo        给定两个正整数x, k,求第k个最小的正整数y,满足y满足x+y = x|y.   x (1≤x≤2 000 000 000),   k(1≤k≤2 000 000 000)           将x,y用二进制表示,len[x], len[y]分别表示需要多

MasterLuo (Stay Hungry, Stay Foolish) 2095

N!最后一位非0位的求法

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo        PS:这篇文章是很早以前我在使用博客圆的时候写的,后来换了两次搏客,都把这篇文章拿过来了。        问题是求关于N!的最后一位非0位, 如3!=6,最后一位非0位为6, 5!=120, 最后一位非0位为2.怎么样快速的求出最后一位非0位呢?     最朴素的

MasterLuo (Stay Hungry, Stay Foolish) 1528

一道有挑战性的题

本文内容遵从CC版权协议 转载请注明出自:   http://blog.youkuaiyun.com/masterluo 从1~N这N个数按照下面的排法一直排下去,规定S(N)为左上角是1,右下角为N的这个大矩形里面的所有小矩形里的数的和。例如S(12)就表示图中12个绿色格子的数的和。现在给定N,让你求S(N)。 这道题是TopCoder SRM454 DIV1 Level3的题变过来的

MasterLuo (Stay Hungry, Stay Foolish) 1345
上一篇: 2009 Google Code Jam Qualification Round 题解
下一篇: 独立任务最优调度问题
MasterLuo
博客等级 码龄18年 33粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值