小白月赛4


a-三角形
铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起
在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
的周长是多少?

输入描述:

 
 
第一行两个整数n和q。(1 ≤ n, q ≤ 10 5)第二行n个整数表示第i根木棍的长度a i。(1 ≤ a i ≤ 10 9)接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。

输出描述:

对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
 int n,m,a[102400],b[102400],x,j,*q,v,c[3],flag;
 scanf("%d%d",&n,&m);
 for(int i=0;i<n;i++){
    scanf("%d",&a[i]);
    b[i]=a[i];
 }
 sort(a,a+n);
 while(m--){
  flag=0;
  scanf("%d",&x);
  q=lower_bound(a,a+n,b[x-1]);
  *lower_bound(a,a+n,b[x-1])=0;
  for(int i=v;i>=2;i--){
   c[3]={0};
   for(int j=i,k=2;j>=i-3&&k>=0;j--){
    if(a[j]==0)continue;
    c[k]=a[j];
    k--;
   }
   if(c[2]<c[0]+c[1]&&c[0]&&c[1]&&c[2]){
    printf("%lld\n",c[0]+c[1]+c[2]);
    flag=1;
    break;
   }
  }
  if(flag==0)
    printf("-1\n");
  *q=b[x-1];
 }
 return 0;
}

b-博弈论
铁子和顺溜在学习了博弈论的sg函数之后,解决了很多很多博弈题,现在他们遇到了一道难题。
给出一个长度为 n 的数列,数列里的每个元素都是个位数,这个数列的每一个连续子数列都能生成
一个十进制数,对于子数列a[l~r],这个十进制数的个位为a[r],十位为a[r - 1],...,最高位
为a[l]。
现在铁子需要知道最小的不能被该数列的子数列生成的十进制非负整数是多少?

输入描述:

第一行一个数字n。(1 ≤ n ≤ 1000)
第二行n个数字di。(0 ≤ di ≤ 9)

输出描述:

输出一个数字表示答案。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    int n,a[1024]={0},b[10240]={0},sum,k=0;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=0;i<n;i++)
    {
     sum=0;
     for(int j=0;j<6&&i+j<n;j++)
     {
      sum+=a[i+j];
      b[k++]=sum;
      sum*=10;
     }
    }
    sort(b,b+k);
    int flag=0;
    if(b[0]>=1)
    cout<<0<<endl;
    else{
    for(int i=0;i<k;i++)
     if(b[i+1]>b[i]+1)
     {
      cout<<b[i]+1<<endl;
      flag=1;
      break;
     }
     if(!flag)
        cout<<b[k-1]+1<<endl;
    }
    return 0;
}
c-病菌感染

题目描述

铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们。
培养皿可以被看成一个n*n的方格,最初病菌滴在了这n*n的格子中的某些格子,病菌的传染方式是这样的,如果一个方格与两个或多个被感染的方格相邻(两个方格相邻当且仅当它们只有一条公共边),
那么它就会被感染。现在铁子和顺溜想知道,最终所有的方格会不会都被感染。

输入描述:

第一行两个整数n,m。n表示方格的规格,m表示最初病菌所在的格子数。(1 ≤ n ≤ 1000, 0 < m < n)。
接下来m行每行两个整数x i,y i表示第x i行的第y i个格子有病菌。
数据保证不会有两个病菌初始时在同一个格子。

输出描述:

如果最终所有的方格都会被感染,输出 YES。
否则输出 NO。
#include<iostream>
#include<cstdio>
int main()
{
 int n,m,a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
     for(int i=0;i<m;i++)
        scanf("%d%d",&a,&b);
     printf("NO\n");
    }
 return 0;
}
d-郊区春游

今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区A i和B i,路费是C i。经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑玩耍的顺序),但是由于他们的班费紧张,所以需要找到一条旅游路线使得他们的花费最少,假设他们制定的旅游路线为V 1, V ,V ... V R,那么他们的总花费为从V 1到V 2的花费加上V 2到V 3的花费依次类推,注意从铁子班上到V 1的花费和从V R到铁子班上的花费是不需要考虑的,因为这两段花费由学校报销而且我们也不打算告诉你铁子学校的位置。

输入描述:

第一行三个整数n, m, R(2 ≤ n ≤ 200, 1 ≤ m ≤ 5000, 2 ≤ R ≤ min(n, 15))。
第二行R个整数表示需要去玩耍的郊区编号。
以下m行每行Ai, Bi, Ci(1 ≤ Ai, B≤ n, A≠ Bi, C≤ 10000)
保证不存在重边。

输出描述:

输出一行表示最小的花费

H-相邻的糖果

题目描述

有n个盒子摆成一排,每个盒子内都有a i个糖果。
现在你可以执行以下操作:
·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果。
对你的要求如下:
·任何m个相邻的盒子内糖果数量不能超过x个。
请问,实现要求的最少操作次数是多少?

输入描述:

第一行三个数字n, m, x(2 ≤ n,m ≤ 106,1 ≤ x ≤ 109)。
第二行n个数字(1 ≤ ai ≤ 109)。

输出描述:

输出一个操作数,代表实现要求的最少操作数。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1024000];

int main()
{
    int n,m,x,sum=0,y;
    long long ans=0;
    scanf("%d%d%d",&n,&m,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        if(sum>x)
        {
         y=sum-x;
         ans+=y;
         a[i]-=y;
         sum-=y;
        }
        if(i-m+1>0)
          sum-=a[i-m+1];
    }
    printf("%lld\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/wangtao971115/p/10358377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值