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

总体情况

前四题很水?我居然不会。比赛的时候真的毒,我比赛的网上不去,当我终于写完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的使用真的是强,一般的桶开不到1e9
queue<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];
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值