A. DIY Wooden Ladder
题意:搭梯子,选两条最长的边为基础边,然后选择其他边当台阶,并且台阶数小于基础边;
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int main() { ios::sync_with_stdio(false); int T; cin>>T; while(T--){ int n; cin>>n; int a[maxn]; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); int flag=a[n-2]-1; if(n-2>=flag){ cout<<flag<<endl; } else cout<<n-2<<endl; } return 0; }
B. Pillars
题意:n个位置,每个位置一个半径为ai的碟子,移动碟子,判断能否全部叠在一起,移动的条件满足:位置i->j,abs(i-j)==1,i要有碟子,j要么没有,要么就半径要大于i;
思路:记录最大半径的位置,最大半径的位置一定不会移动,然后向两边找比最大半径小的,(特殊是半径不会相同,并且是1-n)
#include <bits/stdc++.h> using namespace std; const int maxn=2e5+100; int main() { ios::sync_with_stdio(false); int a[maxn]; int n; cin>>n; int flag; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]==n){ flag=i; } } int cnt=n-1,l=flag-1,r=flag+1; while(cnt>0){ if(l>0&&a[l]==cnt) { l--; cnt--; } else if(r<=n&&a[r]==cnt) { r++; cnt--; } else { cnt=-2; break; } //cout<<"l="<<l<<"r="<<r<<"cnt"<<cnt<<endl; } if(cnt==-2) cout<<"NO"<<endl; else cout<<"YES"<<endl; return 0; }
C. Array Splitting
题意:给n个数,并且已经按递增排序,要分成k个子集,计算所有子集最大值和最小值的差和,使得这个和最小;
思路:当子集为1个数的时候,这个的差为0,所以在n个数分成k份时,k-1个为1个数的子集时,n-k个不为1个数的子集时最小,计算数组中两两差值,排序,答案就是前n-k个最小值和;
#include <bits/stdc++.h> using namespace std; const int maxn=3e5+100; int main() { ios::sync_with_stdio(false); int a[maxn]; int n,k; cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } int b[maxn]; for(int i=1;i<n;i++){ b[i]=a[i+1]-a[i]; } sort(b+1,b+n); int sum=0; for(int i=1;i<=n-k;i++) { sum+=b[i]; } cout<<sum<<endl; }
原文地址:https://www.cnblogs.com/lin1874/p/11229539.html
时间: 2024-11-09 04:51:54