BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / henan / #199951同步于 2009/12/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Henan机器人发帖

冬总帮我查异常

ppooooll
2009/12/13镜像同步2 回复
[ 用户 ppooooll 在转载时对文章内容进行了编辑 ] 题目链接: http://acm.pku.edu.cn/JudgeOnline/problem?id=1260 按照前人的解题思路写的程序,过了测试用例,还是各种wa。。。弄了有8个小时了,把我这个新手的求知欲消耗殆尽,只想ac了得了。。。谁能帮我看看代码哪错了。。。。 #include<stdio.h> #include<stdlib.h> #include<string.h> int n_case, n, p[201], temp_price, total_amount; struct pearl{ int amount; int price; }; pearl pl[201]; /*int cmp(const void *a, const void *b){ return(*(pearl *)a).price > (*(pearl *)b).price ? 1 : -1; } */ int main(){ scanf("%d", &n_case); while(n_case--){ scanf("%d", &n); for(int i=0;i<n;i++){ scanf("%d %d", &pl[i].amount, &pl[i].price); } // qsort(pl, n, sizeof(pl[0]), cmp); p[0] = 0; p[1] = pl[0].price * (pl[0].amount + 10); for(int i=2; i<n+1; i++){ total_amount = 10; p[i] = 10000000; for(int j=i; j>0; j--){ total_amount += pl[j-1].amount; temp_price = pl[i-1].price * total_amount + p[j-1]; if(temp_price < p[i])p[i] = temp_price; } } printf("%d\n", p[n]); } return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
ppooooll机器人#1 · 2009/12/13
就是要是买每一种珍珠的话,要多交10个珍珠的起步价 所以有时候买贵的少种类的珍珠比便宜的多种类的珍珠更划算 1.如果将第i种珍珠替换为第i+k种珍珠,要么全部替换,要么不替换。2.对于某一高档次珍珠i,若要和低档次的珍珠合并,那么这些低档次的珍珠必须是和它紧邻的,也就是说,它只有和第i-1,i―2,…,i-k类珍珠合并,同时这种合并必须是连续的. 建立动态规划数组res[],其中res[i]表示当有i种珍珠是所需要的最小费用。于是,我们有: res[i] =min ( res[k] +(a[k+1]+a[k+2]+...+a[i]+10) ×P[i]),k=1,….i-1; 最后res[c]中的内容即是结果。 思路就这样了,冬总快发威 【 在 BismarckDD (豫韵悠悠|以仁为本|〖冰雪猪联盟〗|盟众) 的大作中提到: 】 : 这个等我慢慢看看。。。我看了一会还是一头雾水啊。。。
BismarckDD机器人#2 · 2009/12/13
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #include<iostream> using namespace std; int n_case, n, p[201], temp_price, total_amount; struct pearl { int amount; int price; }; pearl pl[201]; /*int cmp(const void *a, const void *b) { return(*(pearl *)a).price > (*(pearl *)b).price ? 1 : -1; } */ int main() { scanf("%d", &n_case); while(n_case--) { scanf("%d", &n); for(int i=0;i<n;i++) { scanf("%d %d", &pl[i].amount, &pl[i].price); } //qsort(pl, n, sizeof(pearl), cmp); p[0] = 0; p[1] = pl[0].price * (pl[0].amount + 10); for(int i=2; i<n+1; i++) { total_amount = 10; p[i] = INT_MAX; for(int j=i; j>0; j--) { total_amount += pl[j-1].amount; temp_price = pl[i-1].price * total_amount + p[j-1]; if(temp_price < p[i]) p[i] = temp_price; } } printf("%d\n", p[n]); } system("pause"); return 0; } 我怀疑是p[i]的预设置值太小了。。。换成int_MAX就过了 【 在 ppooooll (\_/-->\________/) 的大作中提到: 】 : 就是要是买每一种珍珠的话,要多交10个珍珠的起步价 : 所以有时候买贵的少种类的珍珠比便宜的多种类的珍珠更划算 : 1.如果将第i种珍珠替换为第i+k种珍珠,要么全部替换,要么不替换。2.对于某一高档次珍珠i,若要和低档次的珍珠合并,那么这些低档次的珍珠必须是和它紧邻的,也就是说,它只有和第i-1,i―2,…,i-k类珍珠合并,同时这种合并必须是连续的. : ...................