2020/3/21 Benelux Algorithm Programming Contest 2019

B. Breaking Branches

https://nanti.jisuanke.com/t/44319

 

题意:给一个长度为n的树枝,将数值分为n段,有n-1个位置,谁最后将树枝分为n段谁赢,Alice先开始

          当n为偶数时,Alice赢,n为偶数时,Bob赢

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n&1){
        cout<<"Bob"<<endl;
    }else{
        cout<<"Alice"<<endl;
        cout<<1<<endl;
    }
    return 0;
}
View Code

 E. Efficient Exchange

https://nanti.jisuanke.com/t/44331

 题意:(我这个不会dp的菜鸟 要哭了)

只需设二维dp数组,一维表示当前推到数字的哪一位 二维为0表示在当前这一位时的最低货币值,为1表示当前位+1所需的最低货币值 例如83,

 dp[1, 0] 表示 80 所需最低货币,dp[1, 1]表示90所需最低货币 可得递推式 dp[i+1][0]=min(dp[i][0]+s[i]-'0',dp[i][1]+10-s[i]+'0') dp[i+1][1]=min(dp[i][0]+s[i]-'0'+1,dp[i][1]+10-s[i]+'0'-1);

#include<iostream> 
#include<cstring> 
using namespace std; 
int dp[10005][2]; 
int main(){    
      char s[10005];     
      scanf("%s",s);    
      dp[0][1]=1;    
      dp[0][0]=0;    
       for(int i=0;i<strlen(s);i++){        
           dp[i+1][0]=min(dp[i][0]+s[i]-'0',dp[i][1]+10-s[i]+'0');         
           dp[i+1][1]=min(dp[i][0]+s[i]-'0'+1,dp[i][1]+10-s[i]+'0'-1);    
     }     
        printf("%d",dp[strlen(s)][0]);    
        return 0;
 }
View Code

 

F. Find my Family

https://nanti.jisuanke.com/t/44322

     题意:有k张全家福,每张全家福有那个人,计算有几张照片,对于一张全家福中的每个值,找到它右边最大的元素(右边数),和左边比它大的元素集合中最小的元素(左边数)。

               如果左边最大的元素小于右边最大的元素,则存在213排序。先找出右边数的最大值,再找出左边数。(看了好长时间题解才弄明白)。

 

#include<iostream>
#include<algorithm>
#include<memory>
#include<cstdio>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 3e5+7,INF = 0x3f3f3f3f;// 满足无穷大加无穷大仍为无穷大 
int k,n,Max;
int a[N],maxx[N]; 
vector<int> ans;
int main(){
    cin>>k;
    for(int p=1;p<=k;p++){
        
          cin>>n;
        for(int i=1;i<=n;i++)
          cin>>a[i];
        for(int j=n;j>0;j--){
             if(a[j]>Max){
                 maxx[j] = a[j];      //寻找a[j]右边最大的数
                 Max = a[j];        
             }else{
                 maxx[j] = Max;
             }
        }
         set<int> st;
         Max = 0;
        for(int i=1;i<=n;i++){
            if(!st.size()||a[i]==maxx[i]){  //如果st里有元素或a[i]和右边的最大值相等 
                 st.insert(a[i]);           //把a[i]按排列数序插入 
                 continue; 
          } 
          auto pos = st.upper_bound(a[i]);    //auto自动类型推断 
          if(pos!=st.end()){  //如果左边数不等于 a[i]
              if(*pos<maxx[i]){
                  ans.push_back(p); //把元素p放入ans末 
                  break;
              } 
          }
           st.insert(a[i]);
        }
        
    }
    printf("%d\n",ans.size());
    for(int i=0;i<ans.size();i++)
    printf("%d\n",ans[i]);
    return 0;
}
View Code

  J. Jazz it Up!

https://nanti.jisuanke.com/t/44327

题意:m*n 的因子中不能含有平方形式,因为题目中已经说明m 是一个无平方因子的数, 那么只要 n是无平方因子的数,并且m 和 n没有共同的因子即可。

        根据算术基本定理,n可以分解成若干个质数的积,所以m 就直接可以是非n 的因子的一个质数。且m比n小

#include<cmath>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include <cstring>
using namespace std;
bool isprime(int num){
    for(int i=2;i*i<=num;i++){
          if(num%i==0)
          return false;
    }
         return true;
}
int main(){
    int n,i,j,m,k;
    cin>>n;
    for(i=2;i<n;i++){
      
         if(n%i!=0&&isprime(i)){
                cout<<i<<endl;
                return 0;
         }
       
    }

         return 0;
}
View Code

 

 

 

              

 

posted @ 2020-03-26 21:54  Endeavo_r  阅读(142)  评论(0)    收藏  举报