海西蒙古族藏族自治州网站建设_网站建设公司_自助建站_seo优化
2025/12/28 2:13:38 网站建设 项目流程

Happy New Year!

A题没有读题吃了一发罚时,亏大了

B

思考一下什么情况下才是u到离他最近的两个s的距离最近的情况

就是u的左右各有一个距离为d的s如果让所有的u都满足的话那我们无法做到suus所有的u都不可以连在一起

所以我们遇到一个u就让他的左右都为s就可以了

void solve(){string a;cin>>a;int n=a.length();int ans=0;if(a[0]=='u'){a[0]='s';ans++;}if(a[n-1]=='u'){a[n-1]='s';ans++;}for(int i=1;i<n-1;i++){if(a[i]=='u'){if(a[i-1]=='u'){a[i-1]='s';ans++;}if(a[i+1]=='u'){a[i+1]='s';ans++;}}}cout<<ans<<endl;return ;
}

C题

前缀和,后缀和考点,我们总归要去掉一个点无法拿走,所以说我们就暴力遍历选[1,n]保留一个点i

当一个i点被保留的话,i点以后的所有点用操作二拿走进行-ai操作,并且第一个1点只能通过操作一来拿走+a1

而前面的(1,i)的所有点将会以自己最优的结果来进行就是+abs(ai)

void solve(){int n;cin>>n;vector<int>sh(n+1),ab(n+1,0),suf(n+2,0);for(int i=1;i<=n;i++)cin>>sh[i];for(int i=n;i>=1;i--){suf[i]=suf[i+1]+(-sh[i]);}ab[1]=sh[1];for(int i=2;i<=n;i++){ab[i]=ab[i-1]+abs(sh[i]);}int ans=-LLONG_MAX;for(int i=1;i<=n;i++){ans=max(ans,suf[i+1]+ab[i-1]);}cout<<ans<<endl;return ;
}

D题

磕磕绊绊也算完成了,再也不能喝功能饮料了晚上

题目要求我们把n个人物进行一系列的攻击掉血操作而最后仅保留m个人物

可以想到大和小PK,小的一定死掉,而大的会扣除相应的血量

所以我们不妨把这个问题当作一个覆盖问题,就像这样

image

类似于这样一个概念就是我的大的数字一定要把小的数字给盖住,而且盖住的数字我们认为他死掉了,如果孩子的和没有超过帽子,我们就认为这个帽子还活着

然而如果规定的存活数超过一半,则无法在剩下的人都攻击过的前提下完成,所以我们直接-1

然后我们有多少个m我们就要存在多少个帽子(当然帽子越大越好,所以我们先从大到小排序)

image

问题的解决方式就类似于这样,一直向后累加每次把这个帽子放到接近爆满,才进行下一个操作,但是别忘了提前给每个帽子塞一个孩子

特别的如果m=0的话,我们可以认为第一个帽子是死的

image

如果第一个帽子填满了也无法爆掉的话就证明无法满足m=0,所以我们输出-1即可

我们载入步骤的时候可以直接把帽子和孩子给加入ans,在最后的时候进行筛查,避免出现一个人物进行多次攻击的情况

我们思路是从大到小操作,实际上与真实步骤相反,所以我们最后反转一下ans就可以了得到答案了

void solve(){int n,m;cin>>n>>m;vector<Node>sh(n);for(int i=0;i<n;i++){cin>>sh[i].a;sh[i].h=sh[i].a;sh[i].id=i+1;}if(m>n/2){cout<<-1<<endl;return ;}sort(all(sh),[&](Node i,Node j){return i.a>j.a;});vector<pii>ans;int res=m,l=0;if(m==0){res++;int top=sh[l].h;for(;res<n;res++){if(top<=0)break;top-=sh[res].a;ans.push_back({sh[l].id,sh[res].id});}l++;if(top>0){cout<<-1<<endl;return ;}}for(;res<n&&l<m;res++,l++){ans.push_back({sh[l].id,sh[res].id});}while(res<n){int top=sh[l].h;for(;res<n;res++){if(top-sh[res].a<=0)break;top-=sh[res].a;ans.push_back({sh[l].id,sh[res].id});}l++;}map<int,bool>mp;for(auto &it:ans){if(mp[it.first]){swap(it.first,it.second);}mp[it.first]=1;}reverse(all(ans));cout<<ans.size()<<"\n";for(auto it:ans)cout<<it.first<<" "<<it.second<<"\n";return ;
}

 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询