湘潭大学新生赛总结

总体情况还算可以。

需要注意以下几点:

1。比赛开始时不要慌,头脑必须清醒,不能乱。

2。对于数据超级大的题,不是公式题就可能是规律题,此时就可以小范围打表,观察是否有规律。

3。相信队友。

最最最重要的是,不要过了样例就TM浪,(T.T)   我想哭。。。。

下面是几道题总结:

Clock

题目描述

钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?

Clock

输入

第一行是一个整数 T(1T1440) ,表示样例的个数。以后每行是一个时刻,格式为HH:MM。

输出

每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。

样例输入

2
00:01
00:30

样例输出

5.5
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int h,m,j=0;
        scanf("%d:%d",&h,&m);
        if(h>=12)
            h-=12;
        double p=fabs(h*30*1.0+m*(0.5-6));
        if(p>180)
            p=360-p;
        if(m&1)
            printf("%.1lf\n",p);
        else
            printf("%.0lf\n",p);
    }
}
这道题没啥说的,公式题;

角度公式:9点36分:9*30+36*0.5-36*12;


继续:

Finally, which light is on?

题目描述

有n盏灯,编号1~n。一开始灯都是关着的,每个灯有一个开关,按奇数次为打开,按偶数次为关闭。我们先把编号为1的倍数的灯按一下开关,再把编号为2的倍数的灯按一下开关,依次下去,一直到把编号为n的倍数灯按一下,请问最后有多少盏灯是亮的?

lamp

输入

第一行是一个整数 T(1T10000) ,表示样例的个数。以后的每行一个样例,为一个整数 n(1n109)

输出

每行输出一个样例的结果。

样例输入

2
1
5

样例输出

1
2

样例解释

第2个样例,先把1~5都打开;然后把2,4关掉;然后把3关掉;然后把4打开;然后把5关掉;所以,最后剩1和4是亮着的。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m=3,i;
        int sum=0;
        scanf("%d",&n);
        for( i=0;sum<n;i++)
            sum+=m,
            m+=2;
        printf("%d\n",i);
    }
}

这道题没法说,一直尝试用类似于素数筛法的方法怼出来,可惜没什么卵用,,,

打了前几项的表才发现,原来是个规律题,,,3,,5,,7,,9,,,,,(长个记性)


Balance

题目描述

小明有一架天平,小明想称出 1n 克的物品,请问最少需要几颗砝码?
比如小明想称出 14 克的物品,需要2颗砝码,为1和3克。

balance

输入

第一行是一个整数 T(1T10000) ,表示样例的个数。以后每行一个样例,为一个整数 ( 1n109 )。

输出

每行输出一个样例的结果。

样例输入

3
1
4
40

样例输出

1
2
4

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long n;
        scanf("%lld",&n);
        long long ans=0,sum=0,l=1;
        while(sum<n)
        {
            ans++;
            sum+=l;
            l*=3;
        }
        printf("%lld\n",ans);
    }
}




Estrella's Travel

Accepted : 100 Submit : 258
Time Limit : 1000 MS Memory Limit : 65536 KB 

Estrella's Travel

题目描述

Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有 n+1 座城市,编号依次为 0n ,Estrella住在 0 号城市,目的地是 n 号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶 m 个城市的距离。如果Estrella在某个城市(包括 n 号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少?

输入

多组数据输入。
每组数据第一行两个整数 n(1<n<1000),m(1m<n)
第二行 n 个整数 ai(0<ai1000) ,表示编号为 1,2,,n 的城市的停留花费。

输出

对于每个数据,输出一行,表示总的花费。

样例输入

5 2
1 2 3 4 5
6 2
6 5 4 3 2 1

样例输出

9
9

样例解释

第1个样例,依次到城市1,3,5,所以花费为1+3+5=9;
第2个样例,依次到城市2,4,6,所以花费为5+3+1=9。


感悟:放了这道题一直每补,那个时候最短路spfa还没学,动规学的还不好,搜索也不行,过了几个月了,
回头补了一下题,发现这道题也不是那么难。
思路:
简单dp:假设当前位置为最优状态,就是花费最少。也都知道,动规是往前推,一直找到初始状态,假设
dp[i]为当前最优,那么考虑一下dp[i]怎么来的,是由距离j不超过m的每一个dp[j]加上a[i](假设a数组存的是
对应的花费),我们只需要取他们之间最小的加上a[i]就可以了,前提是,对应的dp[j]也是最优状态哦。
并且注意初始位置是dp[0],而不是dp[1],(我就晕在这了),然后就没啥了。
(竟然被我想到用动规了,并且还实现了,,作为一枚菜鸡,太高兴了)
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int N=1010;
const int INF=1e9+10;
int a[N],dp[N];
int main()
{
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        memset(dp,INF,sizeof(dp));
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        dp[0]=0;
        for(int i=1; i<=n; i++)
            for(int j=i-1; j>=i-k&&j>=0; j--)
                dp[i]=min(dp[i],dp[j]+a[i]);
        printf("%d\n",dp[n]);
    }
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值