2016年第四届湘潭大学新生趣味程序设计竞赛

Age

Accepted : 935   Submit : 2435
Time Limit : 1000 MS   Memory Limit : 65536 KB 

Age

题目描述

今年是2016年,一个年龄小于99岁(出生当年为0岁)的人,把出生年份的前两位和后两位相加得到一个整数n 。你能根据n,算出他有多少岁吗?

输入

第一行输入一个整数T(1T99) ,表示样例的个数。每行输入一个整数n 

输出

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

样例输入

2
20
118

样例输出

16
17

样例解释

第1样例,此人生于2000年;第2样例,此人生于1999年。 


解法:确定首末的时间,循环遍历就行

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX_N 1000000
int main()
{
    int t;
    int num;
    cin>>t;
    while(t--)
    {
        cin>>num;
        for(int i=1918; i<=2016; i++)
        {
            //cout<<i/100<<" "<<i%100<<endl;
            int x=i/100;
            int y=i%100;
            if(x+y==num)
            {
                cout<<2016-i<<endl;
                break;
            }
        }
    }

    return 0;
}

 

Balance

Accepted : 198   Submit : 993
Time Limit : 1000 MS   Memory Limit : 65536 KB 

 

Balance

题目描述

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

balance

 

输入

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

输出

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

样例输入

3
1
4
40

样例输出

1
2
4


 

解法:结论题

#include<stdio.h>
//#include<bits/stdc++.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<sstream>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include<algorithm>
#include<limits.h>
#define inf 0x7fffffff
#define INFL 0x7fffffffffffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define ULL unsigned long long
using namespace std;
long long pow4(long a,long b)
{
    long long r=1,base=a;
    while(b!=0)
    {
        if(b&1)
            r*=base;
        base*=base;
        b>>=1;
    }
    return r;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        int i=0;
        cin>>n;
        long long sum=0;
        while(sum<n)
        {
            sum+=pow4(3,i);
            i++;
        }
        cout<<i<<endl;
    }
    return  0;
}

Clock

Accepted : 353   Submit : 2181
Time Limit : 1000 MS   Memory Limit : 65536 KB 

Clock

题目描述

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

Clock

 

输入

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

输出

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

样例输入

2
00:01
00:30

样例输出

5.5
165

解法:注意是24小时制,其他公式计算,字符串处理去0

#include<bits/stdc++.h>
using namespace std;
map<int,int>q;
double h,m;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        char s[100000];
        scanf("%lf:%lf",&h,&m);
        if(h>=12)
        {
            h-=12;
        }
        double ant=abs((h*30+m*0.5)-m*6);
       // cout<<ant<<endl;
        if(ant>180)
        {
            string ss="";
            double sum=abs(ant-360);
            sprintf(s,"%f",sum);
            int i;
            for(i=strlen(s)-1; i>=0; i--)
            {
                if(s[i]!='0')
                {
                    //  cout<<i<<endl;
                    break;
                }
            }
            if(s[i]!='.')
            {
                for(int j=0; j<=i; j++)
                {
                    ss+=s[j];
                }
                cout<<ss<<endl;
               // cout<<"A"<<endl;
            }
            else
            {
                for(int j=0; j<i; j++)
                {
                    ss+=s[j];
                }
                cout<<ss<<endl;
            }
        }
        else
        {
            string ss="";
            sprintf(s,"%f",ant);
            int i;
            for(i=strlen(s)-1; i>=0; i--)
            {
                if(s[i]!='0')
                {
                    //  cout<<i<<endl;
                    break;
                }
            }
            if(s[i]!='.')
            {
                for(int j=0; j<=i; j++)
                {
                    ss+=s[j];
                }
                cout<<ss<<endl;
            }
            else
            {
                for(int j=0; j<i; j++)
                {
                    ss+=s[j];
                }
                cout<<ss<<endl;
            }
        }
    }
    return 0;
}

Different Digits

Accepted : 211   Submit : 1028
Time Limit : 1000 MS   Memory Limit : 65536 KB 

 

Different Digits

题目描述

有一个n 位数x ,每个数码都不一样,可你知道x 的后m(m<n) 位构成的整数x ,请问满足条件最小的x 是多少?

输入

第一行是一个整数T(1T1000) ,表示样例的个数。 每个样例一行,为两个整数n(2n10) x 的后m 位的整数x(0x<987654321,x0) 

输出

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

样例输入

2
3 12
4 12

样例输出

312
3012

解法:长度只有10,所以,暴力就行

#include<bits/stdc++.h>
using namespace std;
string s,ss;
int n,m;
map<char,int>q;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ss="";
        q.clear();
        cin>>n>>s;
        if(n==s.length())
        {
            cout<<s<<endl;
        }
        else
        {
            for(int i=0; i<s.length(); i++)
            {
                q[s[i]]=1;
            }

            for(char x='1'; x<='9'; x++)
            {
              //  cout<<x<<endl;
                if(q[x]==0)
                {
                    ss+=x;
                    q[x]=1;
                    break;
                }

            }
          //  cout<<ss<<endl;

            for(char x='0'; x<='9'; x++)
            {
                if(ss.length()==n-s.length())
                {
                    break;
                }//  cout<<x<<endl;
                if(q[x]==0)
                {
                    ss+=x;
                    q[x]=1;
                    // break;
                }

            }
            cout<<ss+s<<endl;
        }
    }
    return 0;
}

Estrella's Travel

Accepted : 103   Submit : 262
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。

解法:因为是最多走m个距离,所以暴力保存1-m距离取最小值就行,然后处理

#include<bits/stdc++.h>
using namespace std;
int x[100000],y[100000];
int sum[100000+100000];
int n,m;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            cin>>x[i];
        }
        for(int i=0;i<m;i++)
        {
            sum[n+i]=x[n];
        }
        for(int i = n; i >= 0; i--)
        {
            int Min =(1<<31)-1;
            for(int j = 1; j <= m; j++)
            {
                Min=min(Min,sum[i+j]+x[i]);
            }
            sum[i]=Min;
        }
        printf("%d\n",sum[0]);

    }
    return 0;
}

 

Finally,Which light is on?

Accepted : 229   Submit : 1043
Time Limit : 1000 MS   Memory Limit : 65536 KB 

Finally, which light is on?

题目描述

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

lamp

 

输入

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

输出

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

样例输入

2
1
5

样例输出

1
2

样例解释

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

解法:结论题
#include<bits/stdc++.h>
using namespace std;
map<int,int>q;
double h,m;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int num;
        cin>>num;
        printf("%d\n",(int)sqrt(num));
      //  cout<<<<endl;
    }
    return 0;
}

Gemstone Bracelet

Accepted : 210   Submit : 754
Time Limit : 1000 MS   Memory Limit : 65536 KB 

 

Gemstone Bracelet

题目描述

mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。

mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。

输入

有多个样例,输入的第一行是样例个数T 
每个样例的第一行是两个整数n m (1mn100000) 
第二行是n 个整数ai ,表示n 个宝石的魅力值(1ai10000)

输出

每行输出一个整数,即魅力值和的最大值

样例输入

2
5 3
1 2 3 4 5
10 4
6 7 4 5 8 4 2 5 9 4

样例输出

12
26

解法:保存前缀和,依次处理就好,(记住是成一种环,所以需要再增加原来数组的长度)

#include<bits/stdc++.h>
using namespace std;
long long a[1000010];
long long sum[1000010];
long long x=-1;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(sum,0,sizeof(sum));
        x=-1;
        sum[0]=0;
        long long num;
        long long n,m;
        cin>>n>>m;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            sum[i]+=(sum[i-1]+a[i]);
           // cout<<sum[i]<<endl;
        }
        for(int i=1; i<=n; i++)
        {
            sum[i+n]+=(sum[i+n-1]+a[i]);
           // cout<<sum[i]<<endl;
        }
        x=max(x,sum[m]);
        for(int i=m+1; i<=n+n; i++)
        {
           // cout<<sum[i]-sum[i-m]<<endl;
            x=max(x,sum[i]-sum[i-m]);
           // cout<<sum[i]-sum[i-m]<<endl;
        }
        cout<<x<<endl;
    }
    return 0;
}

 

posted @ 2016-12-18 19:11  樱花落舞  阅读(444)  评论(0编辑  收藏  举报