武汉理工大学第四届ACM校赛 (B、K)---Day5

2023-10-11 14:30

本文主要是介绍武汉理工大学第四届ACM校赛 (B、K)---Day5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

B   不降序列 

 K   雇佣农民


B   不降序列 

        题意:给定一个不降序列 a ,其序列的权值为\sum_{i=1}^{n-1}|a_{i+1} - a_{i}|^{2},你可以对其进行k次操作,每次操作可以删除或修改[a_{2},a_{3}...a_{n-1}]中的一个数字,使其仍然为不降序列。求所能得到的序列权值的最大值

        思路:对于任意一个数a_{i},如果要修改使得权值尽可能的大,即要将它变为a_{i-1} ora_{i+1}。这种操作下同删除这个数字的结果是一样的,因此我们只需要进行删除操作即可。利用dp[i][j]即可,其中i表示了当前数的位置,j表示了当前总共的操作数。对于每次操作,我们删除当前位置之前的一个数。则状态转移方程为dp[i][j] = max(dp[i][j] , dp[i - len - 1][j-len] + (a_{i} - a_{i-len -1})^{2})其中len为此时进行的操作数(如果len = 2 则删除前面两个数)

       

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
const LL maxn = 4e05+7;
const LL N=1000;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
int cmp(int a,int b)
{return a<b;
}
LL qpow(LL a , LL b)//快速幂
{LL sum=1;while(b){if(b&1){sum=sum*a%mod;}a=a*a%mod;b>>=1;}return sum;
}
LL dp[N][N];
const int INF = -1;
void solve() 
{int n , k ;cin>>n>>k;LL a[n + 5];for(int i = 1 ; i <= n ; i++){cin>>a[i];}for(int i = 0 ; i <= n ; i ++){for(int j = 0; j <= k ; j ++){dp[i][j] = INF;}}dp[1][0] = 0;for(int i = 2 ; i <= n ; i++){for(int j = 0 ; j <= k ; j++)//删除操作{	if(i - j < 2)continue;for(int l = 0 ; l <= j; l ++){LL len = j - l;if(i - len >= 2){dp[i][j] = max(dp[i][j] , dp[i - len - 1][j - len] + (LL)(a[i] - a[i - len - 1]) * (a[i] - a[i - len - 1]));}}}} LL ans = 0;for(int i = 0; i <= k ; i++){ans = max(ans,dp[n][i]);}cout<<ans;
}            
int main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;
//	cin>>t;while(t--){solve();}return 0;
}

 K   雇佣农民

        题意:总共需要n个资源,在第i天的白天可以招募最多i名工人,而在晚上这群工人每个人都会产生1个资源,求出刚好得到n个资源的解决方案,输出字典序最大的方案

        思路:首先贪心,假设第 i 天还需要开采 x 个资源,且白天之前的总人数为 m 。若m + i \geq x 则在白天直接全部招满。否则需要进行分类处理,若m \leq x,则只需要在这一天招募x - m个工人即可。否则,需要对前面的工人进行“解雇”处理,使得i \geq x \geq m , 由于所求字典序最大,则要从倒数第二天的工人开始处理。第 j 天的工人对于资源的贡献值Vi - j + 1 ,且第 j 天总共有 j 名工人。若x + j * V < m ,只需要将这一天的招募数量变为0即可。若x + j * V >m,同时要求字典序最大,因此我们需要尽可能少解雇工人,则只需要将x变为x能取到的x\geq m的最小值即可,然后再进行m \leq x时的操作。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
const LL maxn = 4e05+7;
const LL N=1e05+10;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
int cmp(int a,int b)
{return a<b;
}
LL qpow(LL a , LL b)//快速幂
{LL sum=1;while(b){if(b&1){sum=sum*a%mod;}a=a*a%mod;b>>=1;}return sum;
}
void solve() 
{LL P;LL n;cin>>n;P = n;LL sum = 0;LL idx = 1;vector<LL>ans;ans.pb(0);int f = 0;while(n > 0){if(n >= sum + idx){sum += idx;n -= sum;ans.pb(idx);}else{if(n >= sum){LL k = n - sum;ans.pb(k);n = 0;}else{LL le = sum - n;//			cout<<le<<endl;for(int j = idx - 1 ; j > 0 ; j--){if(le <= 0)break;//共j个人LL v = idx - j + 1;if(le >= v * j){le -= v*j;ans[j] = 0;}else{LL num = le/v;le -= num * v;if(le == 0){ans[j] = j - num;}else{le -= v;ans[j] = j - num - 1;int ab = -le;for(int k = j + 1 ; k < idx ; k ++){if(ab <= 0)break;int num = ab/(idx - k + 1);ans[k] += num;ab -= num*(idx - k + 1);}le = -ab;}}}if(le <= 0){ans.pb(-le);f = 1;}n = 0;}}if(n == 0)f = 1;idx++;}if(f){cout<<ans.size() - 1 <<endl;for(int i = 1 ; i < ans.size() ; i ++){cout<<ans[i]<<" ";}}else{cout<<-1;}
}            
int main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;
//	cin>>t;while(t--){solve();}return 0;
}

这篇关于武汉理工大学第四届ACM校赛 (B、K)---Day5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188717

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

2015年校赛总结

题目名为“校赛总结”,其实更想换成“Rainbow为什么五题滚粗?!”。作为今年校赛大二没拆的两个队伍之一,结果打成这样,没脸见人了,总结起来就是我认为自己今天SB了。主要有以下几点: 1.我今天状态的确不好,最后卡的那道B题跟去年在农大校赛上遇见的那题类似,在最后那段时间我已经有思路了,可是由于当时不敢写。等到最后15分钟才开始敲,加上我用很麻烦的Dijstra那种方法,调试起来好多细节要处理

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就

Enlight官方第四届“金融帝国杯”玩家游戏视频邀请赛〔参赛玩家作品展播〕(一)(持续更新中)

Enlight官方第四届“金融帝国杯”玩家游戏视频邀请赛 〔参赛玩家作品展播〕(一)(持续更新中) ————————————— Ⅰ〖比赛时间〗 ◇ 报名参赛(视频发布)时间:2024年06月10日~12月09日 ◇ 比赛颁奖时间:2024年12月底前(届时将在官方①、②、③群同步举行) ◇ 获奖名单刊登:3DM论坛(金融帝国2专区)、百度贴吧(金融帝国2吧) —————————————

【UVa】10600 ACM Contest and Blackout 次小生成树

类型:次小生成树 题目大意: 为了举办ACM竞赛,市长决定给所有的n(3 <= n <= 100)所学校提供可靠的电力供应。当且仅当一个学校直接连到电站,或者连到另一个有可靠供应的学校时,才有可靠供应。现在给出在不同学校之间的布线成本,找出最便宜的两种连线方案。一个方案的成本等于其中所有学校之间连线的成本的总和。 题目分析: 次小生成树。 先求出最小生成树,然后枚举所有不在

acm 学习总结

最近也是新做了几个题目有的通过看题解然后自己敲出来一遍一遍的修改对动态规划也是有了点认识在拿到一个题目考虑他的思路时如果没法找到每个子问题之间的关系并且用数组将他们记忆就说明这个思路是错的而且题目有很多都是根据一个知识点不断的变式。每种类型的题也都有模板最近我在专门看这些模板,模板看的我也是一脸懵,其实我觉得模板这东西说好也好说不好也不好,好的时候你看出来哪种题适合哪种模板套进去题目就ac了,但是