2016 Personal Training #6 Div.2

UVALive6442 - Coins on a Ring

题意:给出长度为n的环,从0开始编号到n-1,在这些点上有凹槽可以插硬币,给出m个硬币,硬币位置可以重复,问要使得这些硬币间的距离相等,输出一个硬币所需要移动的最大值.

思路:二分答案,判断移动mid步是否满足条件.第1个点可移动的范围为[l,r]=[p[0]-mid,p[0]+mid],那么第2个点可移动的范围既要满足与第1个点相差n/m即是在[l+n/m,r+n/m],还要满足自身的移动范围[p[1]-mid,p[1]+mid];

所以l=max(l+n/m,p[1]-mid),r=min(r+n/m,p[1]+mid),

若是l>r说明没有交集,即是不存在同时满足这两个条件的移动范围.

#include<bits/stdc++.h>
using namespace std;
int p[20005],n,m;
bool judge(int d){
  int l=p[0]-d,r=p[0]+d;
  for (int i=1;i<m;++i){
    l=max(l+n/m,p[i]-d);
    r=min(r+n/m,p[i]+d);
    if(l>r)return 0;
  }
  return 1;
}
int main(){
  int t,k=1;
  scanf("%d",&t);
  while (t--){
    scanf("%d%d",&n,&m);
    for (int i=0;i<m;++i){
      scanf("%d",p+i);
    }
    sort(p,p+m);
    int left=0,right=n,mid;
    while (left<right){
      mid=(left+right)/2;
      if(judge(mid))right=mid;
      else left=mid+1;
    }
    printf("Case #%d: %d\n",k++,left);
  }
}


UVALive6440 - Emergency Handling

题意:T组数据,每组数据N个事件,P t0,s(t0),r.P表示病人,t0表示其到达时间,s(t0)表示其最开始的严重性,r表示严重性随着时间增加的比例,A t,要求输出在t时刻严重性最大的病人严重性和他的r.

思路:类似做到过优先队列的题目.s(t)=s(t0)+r(t-t0)=s(t0)-r*t0+r*t.设x=s(t0)-r*t0,该x是个常数,所以严重性和时间是成正比的.因为比例是0-100的数,所以可以开一个105大的优先队列数组.

#include<bits/stdc++.h>
using namespace std;
char str[5];
int main(){
  int t,n,a,b,c,k=1;
  scanf("%d",&t);
  while (t--){
    priority_queue<int>Q[105];
    printf("Case #%d:\n",k++);
    scanf("%d",&n);
    while (n--){
      scanf("%s",str);
      if (str[0]=='P'){
        scanf("%d%d%d",&a,&b,&c);
        Q[c].push(b-a*c);
      }
      else {
        scanf("%d",&a);
        int m=0,r=0;
        for (int i=0;i<=100;i++){
          if (!Q[i].empty()){
            if (Q[i].top()+i*a>=m){
              m=Q[i].top()+i*a;
              r=i;
            }
          }
        }
        printf("%d %d\n",m,r);
        Q[r].pop();
      }
    }
  }
}

UVALive6434 - Number Assignment

题意:T组数据,每组数据输入N,M,输入N个数,输出分成M组数使得每组数的最大值-最小值之和最小.

思路:分析得到每个数之间的差值越大,就应该分开,总共需要分开M次.

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];
bool cmp(int a,int b){
  return a>b;   //此处不能写 a>=b,否则RE.
}
int main(){
  int t,m,n,k=1,sum;
  scanf("%d",&t);
  while(t--){
    scanf("%d%d",&n,&m);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++){
      scanf("%d",a+i);
    }
      sort(a,a+n);
      sum=a[n-1]-a[0];
      for(int i=0;i<n-1;i++){
        b[i]=a[i+1]-a[i];
      }
      int cnt=n-1;
      sort(b,b+cnt,cmp);
      for(int i=0;i<m-1;i++){
        sum-=b[i];
      }
      printf("Case #%d: %d\n",k++,sum);
    }
}


UVALive6437 - Power Plant

题意:看题目Figure1,2就可以明白.

思路:求最小生成树,将其余的几个发电站初始化直接和第一个发电站形成父子关系.

#include<bits/stdc++.h>
using namespace std;
int boss[205];
struct node{
  int a,b,c;
}num[40000];
bool cmp(node A,node B){
  return A.c<B.c;
}
int find(int x){
  return x==boss[x]?x:find(boss[x]);
}
void unio(int x,int y){
  int fx=find(x),fy=find(y);
  if(fx!=fy)boss[fx]=fy;
}
int main(){
  int t,n,m,k,a,b,c,f=1,p1,p;
  scanf("%d",&t);
  while(t--){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
      boss[i]=i;
    }
    scanf("%d",&p1);
    for(int i=1;i<k;i++){
      scanf("%d",&p);
      boss[p]=p1;
    }
    for(int i=0;i<m;i++){
      scanf("%d%d%d",&num[i].a,&num[i].b,&num[i].c);
    }
    sort(num,num+m,cmp);
    int ans=0;
    for(int i=0;i<m;i++){
      if(find(num[i].a)==find(num[i].b))continue;
      ans+=num[i].c;
      unio(num[i].a,num[i].b);
    }
    printf("Case #%d: %d\n",f++,ans);
  }
}


UVALive6439 - Pasti Pas!

题意:T组数据,每组数据一个字符串,可以将子字符串用其他字符替换使得其变成一个回文串,问能形成该回文串的最大长度.题目的样例解释很清楚.

思路:模拟一下过程即可.

#include<bits/stdc++.h>
using namespace std;
string str1,str2,str;
int main(){
  int t,ans,k=1;
  scanf("%d",&t);
  while (t--){
    cin>>str;
    str1=str2="";
    ans=0;
    int len=str.length();
    for (int i=0;i<len/2;++i){
      str1=str1+str[i];
      str2=str[len-1-i]+str2;
      if (str1==str2){
        ans+=2;
        str1=str2="";
      }
    }
    if (len%2)ans++;
    else if (str1!=str2)ans++;
    printf("Case #%d: %d\n",k++,ans);

  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
data_dir=&#39;/public/work/Personal/wuxu/qiantao_17&#39; for file1 in ${data_dir}/*.fasta; do for file2 in ${data_dir}/*.fasta; do if [ "$file1" != "$file2" ]; then touch snp_indel.end.sh && cat snp_indel.end.sh && \ export PATH=/public/work/Personal/pangshuai/software/conda/miniconda3/bin/:${PATH} && \ nucmer --mum -t 8 -g 1000 -p ${file1##*/}.${file2##*/}.ref_based.nucmer $file1 $file2 && \ delta-filter -1 -l 200 ${file1##*/}.${file2##*/}.ref_based.nucmer.delta > ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter && \ dnadiff -d ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter -p ${file1##*/}.${file2##*/}.ref_based.nucmer && \ show-coords -rcloT ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter > ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.coords && \ show-coords -THrd ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter > ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.syri.coords && \ show-snps -ClrTH ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter > ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.snp && \ show-diff ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter > ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.inv && \ perl /public/work/Pipline/Structural_Variation/pipeline/2.1.1/bin/filter_the_MUmmer_SNP_file.pl ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.snp ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.snp.SNPs ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.snp.Insertions ${file1##*/}.${file2##*/}.ref_based.nucmer.delta.filter.snp.Deletions 10000000 && \ touch snp_indel.end.tmp && \ mv snp_indel.end.tmp snp_indel.end && \ sleep 10 fi done done ,增加一个判断,使/public/work/Personal/wuxu/qiantao_17路径下以.fasta结尾的文件两两一组不分前后只组合一次,然后再执行touch 后面的代码
最新发布
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值