刷了vj上三个题,写了食品安全的期末作业,看了尺取(挺有意思)
一、预备役中期测试(羊驼) [补题] - Virtual Judge (vjudge.net)
思路:B是礼物,只需要计算有B的外面有几个括号,从左边开始计算左括号有几个,右括号有几个,遇到'B'就结束,左右括号相减就能得到拆了几层。
AC代码:
#include<stdio.h>
int main()
{
char s[1010];
int i;
while(gets(s))
{
int x=0,y=0;
for(i=0;s[i];i++)
{
if(s[i]=='(')
x++;
if(s[i]==')')
y++;
if(s[i]=='B')
break;
}
int t=x-y;
printf("%d\n",t);
}
}
二、预备役中期测试(羊驼) [补题] - Virtual Judge (vjudge.net)
思路:这个题开始的时候我是看它有几种情况,但是还是会漏掉个别情况,然后我问了个大佬,他就跟我讲了一下这是个数学思维题,至少一个c和至少一个n的时候找最小值,考虑(c+n+m)/3就能解决。
AC代码:
#include <stdio.h>
int main()
{
int q, c, n, m,min,x;
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d",&c,&n,&m);
x=(c+n+m)/3;
min=c<n?c:n;
min=min<x?min:x;
printf("%d\n",min);
}
return 0;
}
三、
预备役中期测试(羊驼) [补题] - Virtual Judge (vjudge.net)
思路:根据提示可知分三种情况,第一种的时候n等于1,最小周长一定是4.第二种,你开平方后,平方乘以平方还等于n,最小周长就是4*n的开平方。最后一种就是两个数相乘等于n,其边长相加最小(如:1*13=13,周长:1+1+13+13=28 1*16=16 周长:1+1+16+16=24 2*8=16 周长2+2+8+8=20 4*4=16 4+4+4+4=16(最小))找最小。
AC代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,x,i,j,min;
scanf("%d",&n);
int t=sqrt(n);
if(n==1) printf("4");
else if((t*t)==n) printf("%d",4*t);
else
{
min=(1+1+n+n);
for(i=2;i<=n;i++)
{
if(n%i==0)
{
if(min>(i+n/i)*2)
min=(i+n/i)*2;
}
}
printf("%d",min);
}
}
四、它叫“尺取”,我总以为是”尽取“,像在尺子(刻度固定,长度可任意缩减)上截取某一段,这是针对需要在给的一组数据中找到不大(小)于某一个上限的“最优连续子序列“的一种算法,利用双指针i,j移动得到这样的一个值。
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
typedef long long ll;
using namespace std;
int main()
{
int ans,i,j,a[200],sum,n,max;
scanf("%d%d",&n,&max);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
i=0;
j=0;
sum=0;
ans=n+1;//默认长度为最大长度
while(1)
{
while(j<n&&sum<max)//j移动不能超过给定长度,但这个sum序列的和大于(小于)所求 值时结束循环
sum+=a[j++];//记录连续序列的和
if(sum<max) break;//所有数都计算完了还是不符合要求则跳出循环。
ans=min(ans,j-i);//找最小长度
sum-=a[i++];//sum的和依次从头开始减掉,i向前移动
}
printf("%d\n",ans);
return 0;
}
这两天有好几篇作文要写,所以学的比较少,明天要开始巩固新星杯的知识了。不要太着急,学会了最重要!!!
明日计划: