2020年04月12日个人赛
2020-04-18 16:00:52来源:博客园 阅读 ()
2020年04月12日个人赛
A - Balloons
题意:本题的题意比较简单,简单说就是分数字,使得A得到的数字之和大于B得到的数字之和,然后输出分给A的数字的下标。
题解:要注意特判n==1和n==2的情况,属于签到题。
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define ll long long using namespace std; int main() { int n; cin>>n; int num[20]= {0}; int sum=0; for(int i=1; i<=n; i++) { cin>>num[i]; sum=sum+num[i];//总数 } if(n==1) { cout<<-1<<endl; } else if(n==2) { if(num[1]==num[2]) { cout<<-1<<endl; } else { cout<<1<<endl; cout<<1<<endl; } } else { //大于等于 3 int su=0; int i; int f=0; for(i=1; i<=n; i++) { su=su+num[i]; sum=sum-num[i]; if(su!=sum&&sum!=0&&su!=0) { f=1; break; } } if(f==1) { cout<<i<<endl; for(int j=1; j<=i; j++) { cout<<j; if(j<i) { cout<<" "; } } cout<<endl; }else{ cout<<-1<<endl; } } return 0; }
B - Cutting
题意:这一题也比较简单,题目给你一个长度为n的数组,两个数之间可以“切断”,代价是两个数的差的绝对值。
题解:这一题的解法有几种,这里我是用背包(0-1)写的,关键是判断那两个数之间可以“切”一刀,代价就作为消耗,获的得利益就视为“1”,这样看,就是一道“0-1背包”的裸题。
代码:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(){ int n,B; cin>>n>>B/*这相当于一个总的体积*/; int num[250]={0}; int jnum=0,onum=0; for(int i=0;i<n;i++){ cin>>num[i]; if(num[i]%2==0){ onum++; }else{ jnum++; } }//数据输入完毕,下面开始处理数据 int t=0;//记录数量 int V[200]={0},W[200]={0}; int tj=0,to=0;//分贝表示前面的奇数与偶数的数量 for(int i=0;i<n;i++){//栏隙 if(i+1<n){ if(num[i]%2==0){ to++; }else{ tj++; } if((tj==to)&&((jnum-tj)==(onum-to))){ W[t]=1; V[t++]=abs(num[i]-num[i+1]); tj=0; to=0; } } } int dp[500]={0}; for(int i=0;i<t;i++){ for(int j=B;j>=V[i];j--){ dp[j]=max(dp[j],dp[j-V[i]]+1); } } cout<<dp[B]<<endl; return 0; }
D - Sonya and Hotels
题意:这道题大概意思是讲,给你一串数字,在数字之间插入一个数,要求这个数和它相邻的数的差的绝对值=d,问存在几个这样的插入点。
题解:这题比较简单,这里我们求相邻两个数的差,若差>2*d的话,就可以插入2个,差=2*d,可以插入一个,注意最后两个端点处各一个。
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define ll long long using namespace std; int main() { ll n,d; cin>>n>>d; int temp,p; cin>>temp; ll ans=0; for(int i=1;i<n;i++){ cin>>p; if(p-temp-2*d>0){ ans++; ans++; }else if(p-temp-2*d==0){ ans++; } temp=p; } cout<<ans+2; return 0; }
E - Sonya and Exhibition
题意:这一题就比较有意思了,大概意思是说,有n朵花,可以是百合or玫瑰,有m个人,给出他们的观察区间,求他们的,美丽值(等于玫瑰花的数量*百合花的数量)的总和,求这个美丽值的最大值。
题解:这一题的关键就是要知道要使单个美丽值最大,就得使区间中的两种花的数量相当,还有一个坑就是他这里给出了有m个人,如果说只有一个人的话,这一点就很好发现了。在这里,我们只需要使两种花的交替出现就好了。(就像一个脑筋急转弯似的)
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define ll long long using namespace std; int main() { ll n,m; cin>>n>>m; ll li,ri; char ptr[10000]; for(int i=0;i<m;i++){ cin>>li>>ri; } for(int i=0;i<n;i++){ if(i%2==0){ cout<<1; }else{ cout<<0; } } return 0; }
F - Sonya and Robots
题意:这一题题意也比较简单,基本要求就是,给你一串有n个元素的int数组,要你从中寻找两个数,将这两个数字分别赋值给两辆小车,并使它们相向运动,在数组中当遇到与本车上相同的数字时,就停止运动,当两辆车的最终的相对位置发生变化时,车子就损坏了,问从这个数组中取出的数的对数,有多少多数可以使车子不损坏。
题解:这道题本质上也是一道简单题,但比赛的时候没看,大概看了也不会写,网上的题解给出的是记录每辆车它的左边有多少种车的数量,再将它们相加即可,可惜我的想法刚好相反,我想到的是记录它的右边的车的种类的数量,最后还没写出来,算是一个思维上的教训吧。
代码:
#include<iostream> #include<cstring> #include<set> #include<algorithm> #define ll long long const int N=100005; using namespace std; int arr[N],vis[N]; set<int> st; int main(){ int n,t; cin>>n; for(int i=0;i<n;i++){ cin>>t; vis[t]=st.size(); st.insert(t); } ll sum=0; for(int i=0;i<=100000;i++){ sum=sum+vis[i]; } cout<<sum<<endl; return 0; }
原文链接:https://www.cnblogs.com/blogxsc/p/12723453.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 2020年04月25日个人赛 2020-04-29
- 2020年04月19日个人赛 2020-04-23
- 2020年04月10日UCF Local Programming Contest 2017 2020-04-10
- 2020年3月28日UCF Local Programming Contest 2016 2020-03-31
- 2020年3月21日Benelux Algorithm Programming Contest 2019 2020-03-25
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash