CodeForces
来源:互联网 发布:node.js能做什么 编辑:程序博客网 时间:2024/06/12 19:51
http://codeforces.com/problemset/problem/899/D
题意:给你1,2,...,n,现在要求取出一对数相加为x。x需要满足:以最多个9结尾。现在给你n,求这样的数对有几个。
*例如,9099算以两个9结尾
题解:设题意的x最多以k个9结尾。
①先想到要求这个k是多少,可以发现一个特殊的数字5,50,500,...。当n<5时,k=0;当n>=5&&n>50时,k=1;当n>=50&&n<500时,k=2...也就是说x是这一样一个数:Z999......(0<=Z<=8,后面接上k个9)。
②经过第一步分解成Z个子问题之后,现在要求解子问题的数对。这个求解就可以自己总结出结论了,可以以14这个输入总结得到。
代码:
#include<bits/stdc++.h>#define debug cout<<"aaa"<<endl#define d(a) cout<<a<<endl#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))#define LL long long#define lson l,mid,root<<1#define rson mid+1,r,root<<1|1#define MIN_INT (-2147483647-1)#define MAX_INT 2147483647#define MAX_LL 9223372036854775807i64#define MIN_LL (-9223372036854775807i64-1)using namespace std;const int N = 100000 + 5;const int M = N * N + 5;const int mod = 1000000000 + 7;const int INF = 0x3f3f3f3f;const double eps = 1e-8;int main(){LL n,k,temp=1,A,ans=0;cin>>n;LL num=5;//小于5的时候特判,这时候k等于9 if(n<5){cout<<n*(n-1)/2<<endl;return 0;}//求解最多以几个9结尾 for(int i=1;i<=11;i++){if(n<num){k=i-1;break;}num*=10;}num=0;for(int i=1;i<=k;i++){num=num*10+9;temp*=10;}for(int i=0;i<=8;i++){//A就是Z999... //num是999... A=i*temp+num;if(n<(A+1)/2){break;}else if(n>(A-1)){ans=ans+A/2;}else{ans=ans+(n-(A+1)/2+1);}}cout<<ans<<endl;return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- 从作用机制和性质上看待methods,watch和computed的关系
- C#窗体绘制基本理解
- 安师大是的是的
- Java--jvm
- JsonUtility解析Json
- CodeForces
- 内排序- 当有两种以上变元的时候的贪心算法
- Gym
- deeplearn.js API用例(二)softmax的手动实现(解决Softmax backprop is not yet implemented问题)
- C++ STL容器之map操作
- JavaScript之Promise实现
- 数据结构--树、森林和二叉树的转换
- 形参和实参是什么?
- Java实现平衡二叉树(AVL树)