2017北京国庆刷题Day1 morning
期望得分:100+100+100=300
实际得分:100+100+70=270
T1位运算1(bit)
Time Limit:1000ms Memory Limit:128MB
题目描述
LYK拥有一个十进制的数N。它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值。例如数字123拥有6的价值,数字999拥有27的价值。
假设数字N的价值是K,LYK想找到一个价值是K-1的数字,当然这个答案实在太多了,LYK想使得这个价值为K-1的数字尽可能大。
输入格式(bit.in)
一个数N。
输出格式(bit.out)
一个数表示答案。你需要输出一个非负整数,且这个数不包含前导0。
输入样例1
199
输出样例1
198
输入样例2
1000
输出样例2
0
对于20%的数据n<=10
对于40%的数据n<=100
对于60%的数据n<=1000
对于100%的数据1<=n<=100000。
最后一个非零数-1
#include<cstdio> using namespace std; int num[7],bit[7],ans[7]; int main() { freopen("bit.in","r",stdin); freopen("bit.out","w",stdout); int n,len=0; scanf("%d",&n); bit[0]=1; for(int i=1;i<7;i++) bit[i]=bit[i-1]*10; while(n) num[len++]=n%10,n/=10; bool ok=false; for(int i=0;i<len;i++) { ans[i]=num[i]; if(!ok && ans[i]) ans[i]--,ok=true; } int out=0; for(int i=0;i<len;i++) out+=ans[i]*bit[i]; printf("%d",out); return 0; }
T2火柴棒 (stick)
Time Limit:1000ms Memory Limit:128MB
题目描述
众所周知的是,火柴棒可以拼成各种各样的数字。具体可以看下图:
通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推。
现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用完,并且想知道能拼出的最小和最大的数分别是多少。
输入格式(stick.in)
一个数k。
输出格式(stick.out)
两个数,表示最小的数和最大的数。注意这两个数字不能有前导0。
输入样例
15
输出样例
108 7111111
数据范围
对于30%的数据k<=10。
对于60%的数据k<=20。
对于100%的数据1<k<=100。
最大:
k=偶数,k/2个1
k=奇数,1个7和(k-1)/2个1、
最小:
dp[i][j] j根火柴棒拼成的最小的i位数
其实第一维没有用
#include<cstdio> #include<algorithm> using namespace std; int use[8]={-1,-1,1,7,4,2,0,8}; int k; long long dp[16][101]; void out(long long x) { if(x/10) out(x/10); putchar(x%10+'0'); } void solve_min() { if(k==6) { printf("0"); return; } int len=k/7+1; for(int i=2;i<8;i++) dp[1][i]=use[i]; dp[1][6]=6; if(dp[1][k]) { out(dp[1][k]); return;} for(int i=2;i<=len;i++) { for(int j=1;j<=k;j++) for(int l=2;l<=7;l++) { if(j-l<=1) continue; if(!dp[i-1][j-l]) continue; if(!dp[i][j]) dp[i][j]=dp[i-1][j-l]*10+use[l]; else dp[i][j]=min(dp[i][j],dp[i-1][j-l]*10+use[l]); } if(dp[i][k]) { out(dp[i][k]); return; } } } void solve_max() { int len=k/2; if(k&1) { printf("7"); for(int i=1;i<len;i++) printf("1"); } else { for(int i=1;i<=len;i++) printf("1"); } } int main() { freopen("stick.in","r",stdin); freopen("stick.out","w",stdout); scanf("%d",&k); solve_min(); printf(" "); solve_max(); }