A. Remainder https://codeforces.com/contest/1165/problem/A
分析: 暴力捞出后 x 位, 然后看看后 y 位和它的差距
- #include "bits/stdc++.h"
- using namespace std;
- int n;
- int x,y;
- int main()
- {
- string s;
- scanf("%d%d%d",&n,&x,&y);
- cin>>s;
- int cnt=0;
- string sx="";
- for(int i=n-1;i>=n-x;i--){
- sx+=s[i];
- }
- //cout
- if(sx[i]!='0') cnt++;
- }
- if(sx[y]!='1') cnt++;
- for(int i=y+1;i<x;i++){
- if(sx[i]!='0') cnt++;
- }
- printf("%d\n",cnt);
- return 0;
- }
- B. Polycarp Training https://codeforces.com/contest/1165/problem/B
分析: 看其中是否存在比 i 大的
- #include "bits/stdc++.h"
- using namespace std;
- const int maxn=2e5+100;
- int n,a[maxn];
- int vis[maxn];
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++){
- scanf("%d",&a[i]);
- }
- sort(a+1,a+1+n);
- int i=1,j=1;
- int cnt=0;
- while(j<=n){
- if(a[j]>=i){
- cnt++;
- i++,j++;
- }else{
- j++;
- }
- }
- printf("%d\n",cnt);
- return 0;
- }
- C. Good String https://codeforces.com/contest/1165/problem/C
分析: 看奇数位和它下一位是否相同, 如果相同, 就删除到不相同为止, 最后注意一下奇偶
- #include "bits/stdc++.h"
- using namespace std;
- const int maxn=2e5+100;
- int n;
- string s;
- int vis[maxn];
- int main()
- {
- cin>>n;
- cin>>s;
- int i=0;
- while(i<n){
- if(s[i]!=s[i+1]){
- i+=2;
- }else{
- int j=i+1;
- while(j<n&&s[j]==s[i]){
- vis[j]=1;
- j++;
- }
- i=j+1;
- }
- }
- int cnt=0;
- for(int i=0;i<n;i++){
- if(vis[i]==1) cnt++;
- }
- int flag=0;
- if((n-cnt)%2){
- cnt++;
- flag=1;
- }
- printf("%d\n",cnt);
- string res="";
- for(int i=0;i<n;i++){
- if(vis[i]==0) res+=s[i];
- }
- if(flag){
- for(int i=0;i<res.size()-1;i++) cout<<res[i];
- cout<<endl;
- }else cout<<res<<endl;
- return 0;
- }
- D. Almost All Divisors https://codeforces.com/contest/1165/problem/D
分析: 把最大约数和最小约数乘起来, 然后枚举这个数的所有约数, 看是否满足条件
- #include "bits/stdc++.h"
- using namespace std;
- const int maxn=2e5+100;
- typedef long long LL;
- int T;
- LL d[maxn];
- int main()
- {
- scanf("%d",&T);
- while(T--){
- int n;
- scanf("%d",&n);
- for(int i=1;i<=n;i++) scanf("%d",&d[i]);
- sort(d+1,d+n+1);
- LL res=d[1]*d[n];
- vector<LL>v;
- for(LL i=2;i*i<=res;i++){
- if(res%i==0){
- if(i*i!=res){
- v.push_back(i);
- v.push_back(res/i);
- }else{
- v.push_back(i);
- }
- }
- }
- sort(v.begin(),v.end());
- if(v.size()!=n){
- cout<<"-1"<<endl;
- }else{
- int flag=0;
- for(int i=1;i<=n;i++){
- if(v[i-1]!=d[i]){
- flag=1; break;
- }
- }
- if(flag) cout<<"-1"<<endl;
- else cout<<res<<endl;
- }
- }
- return 0;
- }
- E. Two Arrays and Sum of Functions https://codeforces.com/contest/1165/problem/E
分析: 化简式子可知, 每个 \(a_i \times b_i\) 只会在 \(l \leq i\) 的时候被枚举, 同时每次被加的次数一定是 \(n-i+1\), 所以我们令 \(val_i=i \times (n-i+1) \times a_i\), 然后因为要最小化那个函数, 所以一定要使得 \(val_i \times b_i\) 最小, 所以用最大的 \(val_i\) 和最小的 \(b_i\) 组合即可
- #include "bits/stdc++.h"
- using namespace std;
- const int maxn=2e5+100;
- typedef long long LL;
- const LL mod=998244353;
- LL a[maxn],val[maxn],b[maxn];
- int n;
- bool cmp(const LL x,const LL y){
- return x>y;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++){
- scanf("%lld",&a[i]);
- val[i]=i*1ll*(n-i+1)*a[i];
- }
- sort(val+1,val+1+n,cmp);
- for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
- sort(b+1,b+1+n);
- LL sum=0;
- for(int i=1;i<=n;i++){
- LL tmp=((val[i]%mod)*(b[i]%mod))%mod;
- sum+=tmp;
- sum%=mod;
- }
- printf("%lld\n",sum);
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3071929.html