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; }
E. Efficient Exchange
题意:(我这个不会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; }
F. Find my Family
题意:有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; }
J. Jazz it Up!
题意: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; }