標籤:
諭神的密碼Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status
諭神是集訓隊裡面智商數一數二的大神,在他的電腦裡儲存著他在學習的東西。每天都要通過學習來提高自己的知識水平。然而,作為一個長者,諭神不願意將自己的學習資料給那些too young, too simple, sometimes naive的人看,以免被他們看了去搞一個大新聞。於是,諭神給自己的電腦設定了密碼。
當然,他設定的密碼也要按照基本法。這個基本法是諭神自己搞出來的。法則是這樣的:
1、密碼由2個n位元組成,中間由空格隔開,其中,兩個數的各個位的和均為s
2、是滿足1條件的最小的數和最大的數
3、當找不到n位元的和為s的時候,密碼就是:-1 -1。
4、諭神保證密碼的2個數中沒有前置0。
他這個密碼只是為了防止too young, too simple, sometimes naive的人進入電腦的,對於你們這些高智商的人群,破譯密碼應該並不難吧~~
注意,單獨的0,是合法的哦~
Input
先讀入一個T(0≤T≤100),為資料群組數
每組資料只有一行,為n(0<n≤100)和s(0≤s≤900).
Output
輸出諭神的密碼
Sample input and output
| Sample Input |
Sample Output |
12 15 |
69 96 |
Hint
就一組測試資料 2位元各位和為15的最大值是96, 最小值是69.
題解:wa了一個小時,這個題可以分兩步求,先求最小的,再求最大的,最小的要滿足前面的數儘可能小但第一位不能是1,最大的要滿足前面的數儘可能大,
如果這n位元每位都是9和還小於s的或就不滿足,如果當n大於1,s等於0不滿足;然後貪心找出每一位的值;主要要考慮全細節
代碼:
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;#define mem(x,y) memse(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define PI(x) printf("%d",x)#define P_ printf(" ")const int MAXN=1010;int a[MAXN];int main(){ int T,n,s; SI(T); while(T--){ SI(n);SI(s); if(9*n<s){ puts("-1 -1");continue; } if(s==0&&n>1){ puts("-1 -1");continue; } if(s==0&&n==1){ puts("0 0");continue; } int temp=s; if(s>9*(n-1))a[n]=s-9*(n-1),s-=s-9*(n-1); else a[n]=1,s-=1; for(int i=n-1;i>=1;i--){ if(s>9*(i-1))a[i]=s-9*(i-1),s-=s-9*(i-1); else a[i]=0; } for(int i=n;i>0;i--)PI(a[i]);P_; s=temp; for(int i=n;i>=1;i--){ if(s>=9)a[i]=9,s-=9; else a[i]=s,s-=s; // printf("**%d\n",s); } for(int i=n;i>0;i--)PI(a[i]); puts(""); } return 0;}
諭神的密碼(思維)