A题,读错题意,坑了好久,大于d的橘子不用加,每次总和大于b之后就要清空,然后答案加1
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define pii pair<int,int> #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,b,d,ans=0,sum=0; cin>>n>>b>>d; for(int i=0;i<n;i++) { int a; cin>>a; if(a>b)continue; sum+=a; if(sum>d)sum=0,ans++; } cout<<ans<<endl; return 0; } /******************** ********************/
B题,先判断初始点是不是在最左边(或最右边)这样直接一次走到第n-1(2)个就行了,再判断从左(右)边走到最右边-1,从右(左)边走到最左边-1的最小值就好了
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define pii pair<int,int> #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f; int a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,k; cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; if(n==1) { cout<<0<<endl; return 0; } sort(a+1,a+1+n); if(k<=a[1]) { cout<<a[n-1]-k<<endl; return 0; } if(k>=a[n]) { cout<<k-a[2]<<endl; return 0; } int ans=min(min(abs(k-a[2]),abs(k-a[n]))+abs(a[2]-a[n]),min(abs(k-a[n-1]),abs(k-a[1]))+abs(a[n-1]-a[1])); cout<<ans<<endl; return 0; } /******************** ********************/
C题,从第一次出现不是a的开始,一直更新到出现a为止,注意特判全是a的情况
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define pii pair<int,int> #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; cin>>s; int i=0; while(i<s.size()) { if(s[i]=='a')i++; else break; } if(i==s.size()) { cout<<s.substr(0,s.size()-1)+'z'<<endl; return 0; } while(i<s.size()) { if(s[i]!='a')s[i]--,i++; else break; } cout<<s<<endl; return 0; } /******************** ********************/
D题,特判b==0,c==0,a==0或d==0的情况,如果不能找到对应00,11的值就输出impossible,可以先预处理打个表,此时1的个数*0的个数一定等于b+c
把0尽可能放在最左边,和最右边,直到b<1的个数,c<1的个数而且b+c==1的个数,最后遍历一边找出现b次1的位置放0就好了
#include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define pii pair<int,int> #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f; map<ll,ll>ans; int main() { ios::sync_with_stdio(false); cin.tie(0); for(ll i=1;i<=1e5;i++)ans[i*(i-1)/2]=i; ll a,b,c,d; cin>>a>>b>>c>>d; if(a==0&&b==0&&c==0&&d==0) { cout<<"0"<<endl; return 0; } ll aa=ans[a],dd=ans[d]; if(ans[a]==0||ans[d]==0) { cout<<"Impossible"<<endl; return 0; } if(b==0&&c==0) { if(a==0&&d!=0)cout<<string(dd,'1')<<endl; else if(a!=0&&d==0)cout<<string(aa,'0')<<endl; else if(a!=0&&d!=0)cout<<"Impossible"<<endl; return 0; } if(aa*dd!=c+b) { cout<<"Impossible"<<endl; return 0; } string s=string(dd,'1'); int p=b/dd; b-=p*dd; s=string(p,'0')+s; p=c/dd; c-=p*dd; s=s+string(p,'0'); if(c==0&&b==0) { cout<<s<<endl; return 0; } int one=0; for(int i=0;i<s.size();i++) { if(s[i]=='1')one++; if(one==c) { // cout<<i<<endl; s=s.substr(0,i+1)+'0'+s.substr(i+1,s.size()); break; } } cout<<s<<endl; return 0; } /******************** 1 2 2 1 ans[2]=1, ********************/