Codeforces Round #582 (Div. 3)
题意:
给出n和q,输出从q,2q,3q....n的个位数的和
题解:
很明显就是有规律,手动找循环即可
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long int flag[11]; ll a[10010]; int main() { int t,n; scanf("%d",&t); while(t--) { ll i,n,m,cnt = 0; memset(flag,0,sizeof(flag)); scanf("%lld%lld",&n,&m); if(n < m){ cout<<"0"<<endl; continue; } int c = 0; for(i=m;i<=n;i+=m) { int k = i%10; if(flag[k]){ break; } else{ cnt += k; a[++c] = cnt; flag[k] = 1; } } if(i == n+m) { cout<<cnt<<endl; continue; } i -= m; ll ans = cnt*(n/i); if(n%i == 0){ cout<<ans<<endl; continue; } ll k = n%i; ans += a[k/m]; cout<<ans<<endl; } return 0; }
- 题意:
- 本题有俩个难度,唯一区别是n的个数不一样。
- 给出n个数和k,每次执行选择一个数除以2,问你让这个数列k个数相等的最少执行次数。
- 题解:
- 排一遍序,因为n<=2e5,顶多可以除17次,所以直接递归求答案就行。
- 代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxx = 2e5+10; int a[maxx],ans[maxx],cnt[maxx]; int n,k,minn = 1e9+7; void solve(int x,int y) { cnt[x]++; ans[x] += y; if(cnt[x] == k) minn = min(minn , ans[x]); if(x == 0) return ; solve(x/2,y+1); } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+1+n); for(int i=1;i<=n;i++){ solve(a[i],0); } cout<<minn<<endl; return 0; }