51NOD 1385凑数字(找规律?)
思路:这个题是真的想了蛮久,枚举了一下前一百就发现了规律,要想最短的话就是要构建1234567890这个字符串;刚开始找到的规律从1开始枚举到N,每满一百加一,每出现一个各个位数上数字相同的(例如3,22,111)都加一;然后数太大枚举肯定要超时,于是改进了一下,假如这个数是一千,那么它最小位数起码是10*3;假如这个数是一万,那么这个最小位数起码是10*4;依次类推,可以发现最小位数的组成部分肯定有10*(len-1),然后剩下的就是找到看n能被多少个len个1的数整除,加上这个数就可以了。但是这样只过了一半样例,下载一个错误的样例发现,输入太大了,已经超过了longlong的范围,所有这种方案也失败了。然后当然是百度,发现自己好像多此一举了,直接加上第一位n[0]然后在判断n的所有字符是否相同,如果相同则再加一。
#include<cstdio> #include<string> #include<iostream> #include<sstream> using namespace std; int main() { string num; cin >> num; stringstream ss; ss << num; long long cnum; ss >> cnum; ss.clear(); long long sum = 0; sum += 10 * (num.length() - 1); cout << sum << endl; string slen(num.length(), '1'); ss << slen; long long cslen; ss >> cslen; ss.clear(); sum += cnum / cslen; cout << sum << endl; return 0; }
但是还是错了!发现自己想问题还是想的太简单了,并不是后面所有位是相同才加一,大于等于相同位数相同的那个数都能够进行加一,比如223比222大
再次在提供两组样例
输入样例1: 777777777777777777777777777777777777777777777777777776 输出样例1: 536 输入样例2: 1156532368851100011559833235112186568441122132385787789665411223354115898941005523300114444886300010 输出样例2: 991
#include<cstdio> #include<string> #include<iostream> using namespace std; int main() { string num; cin >> num; long long sum = 0; sum += 10 * (num.length() - 1); sum += num[0] - '1'; int flag = 1; for (int i = 0; i < num.length() - 1; i++) if (num[i] <num[i + 1]){ //假如后面有一位数大于前一位就不用在找了 break; } else if (num[i] > num[i + 1]){ flag = 0; break; } if (flag)sum++; cout << sum << endl; return 0; }