标签:inner 相同 log 自己 ace 问题: 三台 10个 表示
时间: 1000ms / 空间: 655360KiB / Java类名: Main
冬令营入学测试题
题目描述
小D是一名魔法师,它最喜欢干的事就是对批判记者了。
这次记者招待会上,记者对于小D的数学很好奇。于是小D找了个方法把记者批判了一番。
它对记者抛出了这么一个问题:我有n点能量,写下数字i(1<=i<=9)需要花费a{i}点能量,我用这n点能量最多能写出什么数来?(当然可以不用光n点能量,具体看样例)
记者们一脸懵逼,于是来求助于你。
一行10个数,表示n,a1,a2,a3,…,a9。
一个数表示答案。
输入样例1
10 2 2 1 2 2 2 2 2 2
输出样例1
3333333333
输入样例2
10 4 11 11 11 11 11 11 11 10
输出样例2
11
数据范围
对于30%的数据n,ai<=10。
对于60%的数据n,ai<=100。
对于100% 的数据1<=n,ai<=1000000,n>=min{ai}。
【题目大意】
1-9这9个数,每写一个数都会耗费一定的能量,你有n点能量。
能写多大的数。
【思路】
贪心
一个数位数越大这个数越大,位数相同时高位数越大这个数越大。
我们先用耗能量小的数添位数,让我们写的这个数位数尽量的长。
然后用剩余的能量在位数不变的情况下,位数能换成更大的数就换。
【吐槽】
(#‵′)靠我换了三台机子编译器都炸 我还以为是自己代码错了一直在调ORZ.
rp是个好东西 希望我也有QAQ
【code】
一开始我只是按照耗能由小到大排序,尽量写得位数多,没有想到在位数不变的情况下换更大的数。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct N { int val,sz; }s[11]; int n,l=1,cnt,ans[10000]; bool cmp(N a,N b) { if(a.val==b.val)return a.sz>b.sz; return a.val<b.val; } int main() { scanf("%d",&n); for(int i=1;i<=9;i++) { scanf("%d",&s[i].val); s[i].sz=i; } sort(s+1,s+10,cmp); s[10].val=1e9; while(n) { while(n>=s[l].val) { n-=s[l].val; ans[++cnt]=s[l].sz; } if(l>9)break; l++; } for(int i=1;i<=cnt;i++) cout<<ans[i]; return 0; }
dalao代码 条理清晰 层次分明
#include<iostream> #include<cstdio> using namespace std; int n,a[20],minn=1e9,s,ans[10]; int main() { scanf("%d",&n); for(int i=1;i<=9;i++) scanf("%d",&a[i]); for(int i=1;i<=9;i++) { if(a[i]<minn||(a[i]==minn&&i>s)) { minn=a[i]; s=i; } } ans[s]=n/minn; n%=minn; for(int i=9;i>s;i--) { while(minn+n>=a[i]) { ans[s]--; ans[i]++; n=n+minn-a[i]; } } for(int i=9;i>=1;i--) for(int j=1;j<=ans[i];j++) printf("%d",i); return 0; }
标签:inner 相同 log 自己 ace 问题: 三台 10个 表示
原文地址:http://www.cnblogs.com/zzyh/p/7010810.html