Educational Codeforces Round 106 (Rated for Div. 2)

简介: A. Domino on Windowsill

A. Domino on Windowsill


题意:先给你三个数n,k1,k2,分别是在第一行和第二行能放白块位置的大小,然后告诉你a(白块),b(黑块)的数量,且大小都是2x1,横竖都可以,看能否把a+b个库洛米摆下。


思路:用白色的块找下规律,同理找黑色块规律即可。


20210324211456766.png

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int k1,k2,t,i,j,a,b,w,n;
  cin>>t;
  while(t--){
    cin>>n>>k1>>k2>>w>>b;
    int ans1=0,ans2=0;
    ans1=min(k1,k2)+abs(k1-k2)/2;
    int he1=n-k1,he2=n-k2;
    ans2=min(he1,he2)+abs(he1-he2)/2;
    if(ans1>=w&&ans2>=b){
      cout<<"YES"<<endl;
    } 
    else {
      cout<<"NO"<<endl;
    }
  }
}


B. Binary Removals


题意:题面很复杂,大概就是说不能删除连续的位置的字符,问是否能删成一个递增的序列,求该序列只有0,1两种字符。


思路:找不能的情况很明显就是当出现11之后出现00的情况。\


#include<bits/stdc++.h>
using namespace std;
int main()
{
  string s1;
  int n,i,j,t;
  cin>>t;
  while(t--){
    cin>>s1;
    int flag=0,f1=0;
    for(i=0;i<s1.length()-1;i++){
      if(s1[i]=='1'&&s1[i+1]=='1'){
        flag=1;
      }
      if(flag==1){
        if(s1[i]=='0'&&s1[i+1]=='0')
          f1=1;
      }
    }
    if(f1==1){
      cout<<"NO"<<endl;
    }
    else {
      cout<<"YES"<<endl;
    }
  }
}


C. Minimum Grid Path


题意:从原点出发,目标是N*N,且走的方向只有右和上,很明显向上n次,向右n次,且题目给出每一次行走的路径所要的消耗Ci,自己选择行走的长度,求最少的话费。


思路:首先把所给的数组看成两部分,每隔一个数就是相同的部分,然后去选,因为如果我要找最小的情况需要考虑之前的花费如果太大了则可能不是最优解,所以用前缀和先存下选到当前位置所需要的话费再累乘一下,注意数据范围。


#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int maxn=1e5+10000;
int a[maxn],sum[maxn];
signed main()
{
  int n,i,j,t;
  cin>>t;
  while(t--){
    cin>>n;
    memset(sum,0,sizeof(sum));
    for(i=1;i<=n;i++){
      cin>>a[i];
    }
    sum[1]=a[1]; for(i=2;i<=n;i++) sum[i]+=(sum[i-1]+a[i]);
    int cnt1=1,cnt2=0,min1=a[1],min2=a[2],ans;
    for(i=2;i<=n;i++){
      if(i==2){
        cnt2++;
        ans=sum[i]+(n-cnt1)*min1+(n-cnt2)*min2;
      }
      else if(i%2==0){
      cnt2++;
        min2=min(a[i],min2);
        ans=min(ans,sum[i]+(n-cnt1)*min1+(n-cnt2)*min2);
      }
      else {
        cnt1++;
        min1=min(a[i],min1);
        ans=min(ans,sum[i]+(n-cnt1)*min1+(n-cnt2)*min2);
      }
    }
    cout<<ans<<endl;
  }
}


总结:


C题一开始想dp,后来觉得太复杂,准备放弃的时候看到有三千人过了=。=估计是个思维,想了想就出来了,果然自信最重要了呢。

相关文章
Codeforces Round #192 (Div. 2) (330B) B.Road Construction
要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目。 要求两个城市之间不超过两条道路,那么所有的城市应该是连在一个点上的,至于这个点就很好找了,只要找到一个没有和其他点有道路限制的即可。
40 0
|
机器学习/深度学习 人工智能
Educational Codeforces Round 113 (Rated for Div. 2)C. Jury Meeting
Educational Codeforces Round 113 (Rated for Div. 2)C. Jury Meeting
57 0
|
人工智能 测试技术
Codeforces Round #746 (Div. 2) C. Bakry and Partitioning
Codeforces Round #746 (Div. 2) C. Bakry and Partitioning
85 0
Educational Codeforces Round 113 (Rated for Div. 2)A. Balanced Substring
Educational Codeforces Round 113 (Rated for Div. 2)A. Balanced Substring
88 0
|
人工智能 Windows
Educational Codeforces Round 113 (Rated for Div. 2) C - Jury Meeting (思维 组合数)
Educational Codeforces Round 113 (Rated for Div. 2) C - Jury Meeting (思维 组合数)
97 0
|
机器学习/深度学习 Java
codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
刚开始拿到这题很懵逼,知道了别人的思路之后开始写,但是还是遇到很多坑,要求求P2/S最大。p=a b。就是求(a2+ b2 +2ab)/ab最大,也就是a/b +b/a最大。那么题意就很明显了。
118 0