奋斗群群赛14总结与心得附上周总结与目标

来源:互联网 发布:金鹏远 知乎 编辑:程序博客网 时间:2024/05/21 21:43

  • 总体情况
  • 上周总结与目标
  • T1
    • 题目
    • 思路
  • T2
    • 题目
    • 思路
  • T3
    • 题目
    • 思路
  • T4
    • 题目
    • 思路
  • T5
    • 题目
    • 思路
  • T6
    • 题目
    • 思路
  • T7
    • 题目
    • 思路待补

总体情况

前四题很水?我居然不会。比赛的时候真的毒,我比赛的网上不去,当我终于写完E题,网炸了,然后我没能提交。

上周总结与目标

上周小错不断,什么bug都有。我在i的循环里套i的循环我竟然检查了1个小时没检查出来!完了。下周目标AK。就这样,我随便说说而已。

T1

题目

一个柠檬必须搭配两个苹果和四个梨,给出三种水果的数目,不能切开水果,求你最多能吃多少水果。

思路

普通数学计算。求出柠檬,苹果/2,梨/4的最小值乘以7即可。当时开始做题时已经过了10分钟了,没多想用了循环。

#include<bits/stdc++.h>using namespace std;int main(){int a,b,c,answer=0;cin>>a>>b>>c;for (int i=1;i<=a;i++) if (2*i<=b&&4*i<=c) answer=7*i;cout<<answer;}

T2

题目

给出一个字符串,对其做这样的操作:取出最中间的那个字符(中间偏左的那个),不断重复,直到字符串空。给出取出的字母按顺序组成的字符串,求原来字符串。

思路

一开始我傻了,搞了半个小时才想到。若字符串长度为n,必然是从n-1开始倒着隔两个字符输出之,然后从左边把所有没输出过的字符输出。奇偶分别讨论。

#include<bits/stdc++.h>using namespace std;string s;int main(){int n,i;cin>>n>>s;if (n&1)  {  for (i=n-2;i>=0;i-=2) cout<<s[i];  for (i=0;i<=n;i+=2) cout<<s[i];  }else   {  for (i=n-2;i>=0;i-=2) cout<<s[i];  for (i=1;i<=n;i+=2) cout<<s[i];   }}

可简化之。

T3

题目

在0-n整数点中有一个人要从x1 to x2,他每t2秒走1米。同时有一辆电车以相同的速度t1往返于0-n之间,到达之后立即转向,当此人和电车位置相同时他可立即上电车。输入上述数据以及电车初始位置及朝向,输出此人从x1-x2的最小时间。

思路

也是数学计算,求此人走路要花多久,坐电车要花多久,求最小值。

#include<bits/stdc++.h>using namespace std;int main(){int s,x1,x2,t1,t2,p,d;cin>>s>>x1>>x2>>t1>>t2>>p>>d;int po=p,count=0;//此人坐电车时所在位置,电车经过的距离while (po!=x1)//我先在原位等电车  {  if (po==s) d=-1;  if (po==0) d=1;  po+=d;  count++;  }while (po!=x2)//然后坐电车去目标位置  {  if (po==s) d=-1;  if (po==0) d=1;  po+=d;  count++;  }cout<<min(abs(x1-x2)*t2,count*t1);}

T4

题目

有很多字母B和G摆成一排,任何字母的个数不能有连续k个,给出B和G的个数以及k,求满足条件的一个排列。如果不存在输出“NO”。

思路

这题spj,也是水题之一,但是我差点不会写。给出公式t=max(a,b)/(min(a,b)+1),这个数字大于k说明a,b相差过大无法排列。剩下按照顺序t个G,1个B或者相反顺序输出即可。

#include<bits/stdc++.h>using namespace std;const int boss=2e5;char s[boss+10];int main(){int n,k,a,b,i,r;cin>>n>>k>>a>>b;char x='G',y='B';if (a>=b) swap(a,b),swap(x,y);//看看先输出哪个。int zushu=b/(a+1);int t=zushu+(b%(a+1)?1:0);//如果b能整除a+1,两边可以都是同一个字母,省下一定空间if (t>k) return cout<<"NO",0;else for (i=0;i<=a;i++)//a组  {  if (i!=0) printf("%c",x);//i非0先输出一个x  int count=zushu+((i<b%(a+1))?1:0);//刚好能输出多少y    for (r=1;r<=count;r++) printf("%c",y);  }}

T5

题目

从本题开始代码没有这么简单了。给出一串正整数,必须要使里面没有重复数字并且奇数和偶数的个数相等,你可以用不超过k的正整数去替换之,问至少要替换多少数字?并输出替换完的数串。如果无论如何替换都无法满足要求,输出“-1”。

思路

先去重再判奇偶。如果出现重复看一看奇数个数和偶数个数的差,如果奇数多都换偶数,反之都换奇数,如果相等则奇数换奇数,偶数换偶数。我用这个方法暴力了一下午加一早上一直wa第9个点,我已经改不过来了.所以我借了下面这个代码.

#include<bits/stdc++.h>using namespace std;const int boss=2e5;map<int,int> used;//这里map的使用真的是强,一般的桶开不到1e9queue<int> q;int n,k,c[2],a[boss+10];//count[2]int main(){int i,answer=0;cin>>n>>k;for (i=1;i<=n;i++)   {  scanf("%d",&a[i]);  if (used[a[i]]||c[a[i]%2]==n/2) q.push(i);//a[i]已经出现过了或者奇数偶数超过了一半让它的位置入队,待会全部换掉  else used[a[i]]=1,c[a[i]%2]++;  }for (i=1;i<=k&&!q.empty();i++)  {  if (used[i]) continue;  if (c[i%2]<n/2)//i没有被用过并且还没有换完    {    c[i%2]++;//换完了该数字将该数字所在奇偶位置++    answer++;    a[q.front()]=i;//换掉它    q.pop();    }  } if (!q.empty()) return printf("-1"),0;else   {  cout<<answer<<endl;  for (i=1;i<=n;i++) printf("%d ",a[i]);  } } 

T6

题目

懒得翻译了.
http://codeforces.com/problemset/problem/746/F

思路

看代码.

#include<bits/stdc++.h>using namespace std;const int boss=2e5;int l,r,n,k,w,answer,v,t,a[boss+10],b[boss+10];multiset<int> m,q;multiset<int>::iterator j;int main(){int i;ios::sync_with_stdio(0);cin.tie(0);cin>>n>>w>>k;for (i=0;i<n;i++) cin>>a[i];for (i=0;i<n;i++) cin>>b[i];while (r<n)//已经听到了哪首歌  {  t+=(b[r]+1)/2;//加上歌曲一半的时间  v+=a[r];//该歌曲的娱乐值  m.insert(b[r++]);//在m里插入时间  if (m.size()>w)//听歌的数量已经超出预定    {    q.insert(*(m.begin()));    t+=*(m.begin())/2;    m.erase(m.begin());    }  while (l<=r&&t>k)    {    if (b[l]>=*(m.begin()))      {      t-=(b[l]+1)/2;      m.erase(m.find(b[l]));      if (q.size())        {        j=q.end();        m.insert(*(--j));        t-=*j/2;        q.erase(j);        }      }    else q.erase(q.find(b[l])),t-=b[l];    v-=a[l++];    }  answer=max(answer,v);  }cout<<answer;}

T7

题目

有n座城市,1是首都,两座城市的距离是从一座城市到另一座需要穿过其它城市的数目+1.保证两座城市之间最多有一条路.给出到最远城市的距离t,输入到1距离分别为1,2,3,4,5….t的城市的个数.同时保证只有一条路通向其他城市的”死城”为k座,输出符合条件的一种造公路的方法.如果没有,输出”-1”.

思路(待补)

让我给个位置挂个代码,到时候回来补思路.

#include<bits/stdc++.h>using namespace std;const int boss=2e5;int a[boss+10],route[boss+10];int main(){int n,t,k,i,j,p;cin>>n>>t>>k;for (i=1;i<=t;i++) scanf("%d",&a[i]);if (k>n-t) a[0]=2;else a[0]=1;for (i=0;i<=t;i++)  {  route[i]=min(a[i],a[i+1]);  k-=a[i]-route[i];  } if (k<0||a[0]>1) return printf("-1"),0;for (i=t-1;i>0;i--)  {  p=min(route[i]-1,k);  k-=p;  route[i]-=p;  }int d=1;cout<<n<<endl;for (i=0;i<t;i++)   {  for (j=0;j<a[i+1];j++) printf("%d %d\n",d+j%route[i],d+a[i]+j);  d+=a[i];  }}