9/8 小风吹-思维赛
Posted lin1874
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9/8 小风吹-思维赛相关的知识,希望对你有一定的参考价值。
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;
#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;
#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(奇数,偶数);
#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 的天数,(即从后往前,大于后面值的个数)
#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个;
#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;
以上是关于9/8 小风吹-思维赛的主要内容,如果未能解决你的问题,请参考以下文章