原题链接: https://codeforces.com/contest/1433/problem/A
测试样例
input 4 22 9999 1 777 output 13 90 1 66
题意: 有 10000 10000 10000套公寓,编号从 1 1 1到 10000 10000 10000,现在有一个特别无聊,他会拨打编号上数字都相同的公寓住户号码,直到有人接听才停止,拨打顺序按递增规律,即: 1 − > 11 − > 111 − > 1111 − > 2 − > 22... 1->11->111->1111->2->22... 1−>11−>111−>1111−>2−>22...。现给出接听了电话的住户编号,问这个无聊的人总共按了几次数字。
解题思路: 这道题是一道水题,既然给出接听住户编号,而我们发现这些编号上的数字都是相同的,所以我们用字符串存储其实更为方便。(既可以直接获取长度,又可以直接获取编号上的数字。)那么我们就可以通过简单的公式推导即可解决本题。即设长度为 l e n len len,编号上的数字为 a a a。那么总共按了 ( 1 + 2 + 3 + 4 ) × ( a − 1 ) + ( l e n + 1 ) × l e n / 2 (1+2+3+4)\times (a-1)+(len+1)\times len/2 (1+2+3+4)×(a−1)+(len+1)×len/2。
AC代码
/* *邮箱:unique_powerhouse@qq.com *blog:https://me.csdn.net/hzf0701 *注:文章若有任何问题请私信我或评论区留言,谢谢支持。 * */ #include<bits/stdc++.h> //POJ不支持 #define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增 #define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。 #define pb push_back #define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0) #define fi first #define se second #define mp make_pair using namespace std; const int inf = 0x3f3f3f3f;//无穷大 const int maxn = 1e5;//最大值。 typedef long long ll; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<int, int> pii; //*******************************分割线,以上为自定义代码模板***************************************// int t; string s; int main(){ //freopen("in.txt", "r", stdin);//提交的时候要注释掉 IOS; while(cin>>t){ while(t--){ cin>>s; int len=s.size(); int temp=s[0]-'0'; cout<<10*(temp-1)+(1+len)*len/2<<endl; } } return 0; }