Codeforces Round #710 (Div. 3)

简介: A. Strange Table

A. Strange Table


题意:数列按照横排和竖排两种,告诉你行和列和位置x,求他在竖排的时候的数是多少


思路:画画图就出来鸟找规律。


#include<bits/stdc++.h>
#define int long long 
using namespace std;
signed main()
{
  int n,i,j,t,m,x;
  cin>>t;
  while(t--){
    cin>>n>>m>>x;
    int x1,y1;
    x1=(x%n?x%n:n)-1;
    y1=(x%n?x/n:x/n-1);
    int ans=x1*m+y1+1;
    cout<<ans<<endl;
  }
}


B. Partial Replacement


题意:给你一个由“”和“.”两种字符构成的字符串,要求把其中的一部分“**替换成“X”,且第一个和最后一个“”一定会被替换成‘X’,要求两个相邻的‘X’之间距离不超过k,保证有解,求最小替换次数。


思路:用两种下标去记录一种是目前能修改但是不用修改的下标,当遍历到需要修改的时候优先改之前记录的下标,模拟题,不过有细节处理有点多。


#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,i,j,k,t; 
  string s1;
  cin>>t;
  while(t--){
    cin>>n>>k>>s1;
    int cs=0,zd=0,cnt=0,f=0,mo=0;
    for(i=0;i<s1.length();i++) {
      if(s1[i]=='*'&&f==0)
        f=1,cs=i,cnt++;
      else if(s1[i]=='*')
        zd=i,cnt++;
    }
    if(cnt<=2) {
      cout<<cnt<<endl;
      continue;
    }
    else cnt=2;
    s1[cs]='X',s1[zd]='X';
    for(i=cs;i<=zd;i++){
      if(s1[i]=='*'){
        if(i-cs<=k){
          mo=i;
}
        else {
          cs=mo; cnt++;
          mo=i;
        }
      }
      else if(s1[i]=='X'){
        if(i-cs<=k){
          cs=i;
        }
        else {
          cnt++,cs=i;
        }
      }
    }
    cout<<cnt<<endl;
  }
}

C. Double-ended Strings


题意:有两个字符串 a,b。我们每次操作可以将两个字符串中的一个字符串的最前面一个字符或这最后面一个字符删去(可以将某个字符串通过若干次操作变为空串)。求需要多少次操作才能够使 a,ba,b 两个字符串是相同的。


思路:想用暴力的可是觉得太麻烦了,看到题解发现有substr函数,然后搞了一通也没搞明白,但其实三重循环最外面用长度,然后里面用下标的起点暴力搞就行了。


#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,i,j,t,k;
  string s1,s2,s3;
  cin>>t;
  while(t--){
    cin>>s1>>s2; 
    int ans=0;
    if(s1>s2) {
      s3=s1;
      s1=s2;
      s2=s3;
    }
    for(k=0;k<=min(s1.length(),s2.length());k++){
      for(i=0;i<s1.length();i++){
        for(j=0;j<s2.length();j++){
          if(s1.substr(i,k)==s2.substr(j,k)&&i+k<=s1.length()&&j+k<=s2.length()){
            ans=max(ans,k);
          }
        }
      }
    }
    ans=(s1.length()-ans)+(s2.length()-ans);
    cout<<ans<<endl;
  }
}


D. Epic Transformation


题意:n 个数,每次可以选择其中两个不同的数进行删除,求最后最少剩下多少个数。


思路:找规律的数论题叭,感觉比前面两个容易点= = ,手动模拟一下删数过程,会发现如果一个数出现的次数大于n/2次的话,那么数就是删不完的,否则如果是奇数就剩1,偶数就是0。


#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100000;
int a[maxn];
int main()
{
  int n,i,j,t;
  cin>>t;
  while(t--){
    cin>>n;
    map<int ,int >mo;
    int ans=0;
    for(i=0;i<n;i++){
      cin>>a[i];  
      mo[a[i]]++;
      ans=max(ans,mo[a[i]]);
    }
    if(ans<=n/2){
      if(n%2==0)
        cout<<0<<endl;
      else 
        cout<<1<<endl;
      continue;
    } 
    else {
      if(ans==n)
cout<<n<<endl;
      else {
        cout<<(n-((n-ans)*2))<<endl;
      }
    }
  }
}



相关文章
|
7月前
|
人工智能 算法 BI
Codeforces Round #179 (Div. 2)A、B、C、D
我们每次加进来的点相当于k,首先需要进行一个双重循环找到k点和所有点之间的最短路径;然后就以k点位判断节点更新之前的k-1个点,时间复杂度降到O(n^3),而暴力解法每次都要进行floyd,时间复杂度为O(n^4);相比之下前述解法考虑到了floyd算法的性质,更好了运用了算法的内质。
33 0
|
9月前
|
机器学习/深度学习 人工智能
Codeforces Round 889 (Div. 2)
Codeforces Round 889 (Div. 2)
130 0
Codeforces Round 799 (Div. 4)
Codeforces Round 799 (Div. 4)
93 0
|
索引
Codeforces Round 817 (Div. 4)
Codeforces Round 817 (Div. 4)A~G题解
86 0
|
人工智能 BI
Codeforces Round 827 (Div. 4)
Codeforces Round 827 (Div. 4)A~G题解
77 0