A. Reachable Numbers(codeforce1157/A)
题意:F(x)的作用是让x+1,然后去掉后导0(后导0就是末尾0);A
求不同F(n)的个数;
然后例如3097有:3097 3098 3099 31 32 33 34 35 36 37 38 39 4 5 6 7 8 9 1 2 3
解:观察,当n只有一位数的时候一定是9(一直循环);
然后每一位数都单独拿出来处理,每一位数的不同个数有10-n%10(当n%10不为0的时候,为0直接继续搞下一位);
注意第一次处理的时候,如果为个位数为0的时候不去掉这个0,而是要加上这个n;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll n,ans=0; cin>>n; if(n%10==0){ ans++; n++; } while(1){ if(n<10)break; ll x=n%10; if(x==0){ n/=10; continue; } ans+=10-x; n=n/10+1; } cout<<ans+9<<endl; return 0; }
B. Long Number(codeforce1157/B)
题意:给一串数字,可以选择一串连续的ai修改他的值,每个数字ai只能修改一次,输出修改后的最大值;
解:从左到右第一位开始找,因为高位能变的值一定大于其他低位能改变的值;
遇到第一次f(x)>x的就改变,一直改直到f(x)<x;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; int num[10]; int main(){ int n; string s; cin>>n>>s; for(int i=1;i<=9;i++)cin>>num[i]; int flag=0; for(int i=0;i<n;i++){ int x=s[i]-'0'; if(!flag){ if(x<num[x]){ flag=1; s[i]=num[x]+'0'; } else continue; } else { if(x>num[x])break; else s[i]=num[x]+'0'; } } cout<<s<<endl; return 0; }
C. Chips Moving(codeforce1213/A)
题意:给n个数,每个数都可以进行两个操作(任意次):操作1:x+2/x-2,操作2:x-1/x+1;
操作1免费,操作2花费1;求让所有数字都相同的最小花费;
解:直接统计奇数偶数的个数,ans=min(奇数,偶数);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; const int maxn=110; int a[maxn]; int main(){ std::ios::sync_with_stdio(false); int n; cin>>n; int cnt1=0,cnt2=0; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]%2==0)cnt1++; else cnt2++; } cout<<min(cnt1,cnt2)<<endl; return 0; }
D. Bad Prices(codeforces1213/B)
题意:给n个数,求bad day 的天数,(即从后往前,大于后面值的个数)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; int a[maxn]; int main(){ std::ios::sync_with_stdio(false); int T; cin>>T; while(T--){ int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; int ans=0; int flag=a[n]; for(int i=n-1;i>=1;i--){ if(a[i]>flag)ans++; else { flag=a[i]; } } cout<<ans<<endl; } return 0; }
E. Book Reading(codeforces1213/C)
题意:给一个n,m;求1-n内所有能被m整除的数的个位数之和;
解:m是奇数:每10个一个循环,和为45;m为偶数:每5个一循环,和为20;特判m为5和10的倍数;
n能整除m,在1-n内的个数有n/m个;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+10; int a[maxn]; int main(){ std::ios::sync_with_stdio(false); int T; cin>>T; while(T--){ ll n,m; cin>>n>>m; ll x=n/m; ll ans=0LL; if(m%10==0){ cout<<0<<endl; continue; } if(m%5==0){ if(x%2==0)x/=2LL; else x=x/2LL+1LL; cout<<x*5LL<<endl; continue; } if(m%2){ ll y=x%10; ans=x/10*45; ll k=m; for(int i=0;i<y;i++){ ans+=(k%10); k+=m; } } else { ll y=x%5; ans=x/5LL*20LL; ll k=m; for(int i=0;i<y;i++){ ans+=(k%10); k+=m; } } cout<<ans<<endl; } return 0; }