题目链接
题目翻译:
有一个由10000个公寓组成的建筑,公寓的编号从1到10000(包含1和10000)。
如果一个公寓的编号由相同的数字组成,则称这个公寓是无聊的。比如11,2,777,9999。
我们的角色是一个捣蛋鬼,以下面的顺序不停地拨打所有无聊公寓的对讲机,直到有人回应:
- 首先拨打所有由数字1组成的公寓,以递增的顺序(1,11,111,1111)。
- 然后拨打所有由数字2组成的公寓,以递增的顺序(2,22,222,2222)。
- 以此类推
无聊公寓x的住户回应之后,我们才会停止拨打。
我们想要知道我们总共按了多少个数字,因此你的任务是计算我们总共按了多少个数字。
比如,如果无聊公寓22回应了,那么我们就拨打过1,11,111,1111,2,22,因此我们总共按了1+2+3+4+1+2=13个数字。
你需要回答t个独立的测试用例。
解题思路:
可知结果受两个因素影响,一个是x是由什么数字组成的,另一个是x有几个数字。比如x=22,那么在数字2之前有1,按完1的所有可能需要1+2+3+4=10次;x有两个数字,所以要再按1+2=3次,所以总共是10+3=13次。
总结:设x由a个b组成,那么结果就是(b-1)*10+a*(a+1)/2
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
int main(){
// freopen("1.txt","r",stdin);
int t,n;
string s;
cin>>t;
while(t--){
cin>>s;
int a = s[0]-'0';
int b = s.size();
cout<<(a-1)*10+b*(b+1)/2<<endl;
}
return 0;
}