湘潭OJ:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1253
Age
题目描述
今年是2016年,一个年龄小于99岁(出生当年为0岁)的人,把出生年份的前两位和后两位相加得到一个整数 n 。你能根据n,算出他有多少岁吗?
输入
第一行输入一个整数 T(1≤T≤99) ,表示样例的个数。 每行输入一个整数 n 。
输出
每行输出一个样例的结果。
样例输入
2 20 118
样例输出
16 17
样例解释
第1样例,此人生于2000年;第2样例,此人生于1999年。
题解:题意思路是直接从2016年递减下去,将每个年份的前两位和后两位提取出来,再相加,与输入的数字进行比较,最后做差,得出结果
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
for(int i=2016;i>0;i--)
{
int a = i / 100;
int b = i % 100;
if(a + b == m)
{
int temp = 2016 - i;
cout << temp << endl;
break;
}
}
}
return 0;
}
Gemstone Bracelet
题目描述
mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。
mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。
输入
有多个样例,输入的第一行是样例个数
T
每个样例的第一行是两个整数
n
和
m
,
(1≤m≤n≤100000)
。
第二行是
n
个整数
ai
,表示
n
个宝石的魅力值
(1≤ai≤10000)
输出
每行输出一个整数,即魅力值和的最大值
样例输入
2 5 3 1 2 3 4 5 10 4 6 7 4 5 8 4 2 5 9 4
样例输出
12 26
#include <cstdio>
#include <iostream>
using namespace std;
int a[110000];
int n,c,b,count,sum;
int main()
{
while(scanf("%d",&n) != EOF)
{
while(n--)
{
int max = 0;
count = 0;
scanf("%d%d",&c,&b);
for(int i=0;i<c;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<b-1;i++)
{
a[c+i] = a[i];
}
for(int i=0;i<c;i++)
{
int ans = i;
sum = 0;
for(int j=0;j<b;j++)
{
sum += a[ans++];
}
if(sum > max)
{
max = sum;
}
}
printf("%d\n",max);
}
}
return 0;
}
题解:每次只能从n个宝石中看到m个宝石,思路用数组的方式,从后面补m-1个开头的数,然后直接遍历数组,得出最大值;这题其实挺水的 不过我多重样例没看到,贡献了七发WA才过,一直本地编辑通过,一审核就错误,以后还是要细心读题
Finally, which light is on?
题目描述
有n盏灯,编号1~n。一开始灯都是关着的,每个灯有一个开关,按奇数次为打开,按偶数次为关闭。我们先把编号为1的倍数的灯按一下开关,再把编号为2的倍数的灯按一下开关,依次下去,一直到把编号为n的倍数灯按一下,请问最后有多少盏灯是亮的?
输入
第一行是一个整数 T(1≤T≤10000) ,表示样例的个数。 以后的每行一个样例,为一个整数 n(1≤n≤109) 。
输出
每行输出一个样例的结果。
样例输入
2 1 5
样例输出
1 2
样例解释
第2个样例,先把1~5都打开;然后把2,4关掉;然后把3关掉;然后把4打开;然后把5关掉;所以,最后剩1和4是亮着的。
题解:刚开始每盏灯都是熄灭的,1的倍数是将所有灯都打开,然后2的倍数关闭……以此类推;
思路:刚开始我是直接想暴力解的,用数组解决,不过提交就直接TLE了,后来回来再想一下,打了一个表看一下,结果发现规律很明显,1,4,9的时候才会增加灯的数量,所以直接开根号,AC;
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int a[1<<10];
int main()
{
int t,n,first;
while(scanf("%d",&t) != EOF && t)
{
while(t--)
{
memset(a,0,sizeof(a));
int count = 0;
scanf("%d",&n);
int temp = sqrt(n);
printf("%d\n",temp);
/*
a[1] = 1;
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n;j++)
{
if(j % i == 0)
{
a[j] = !a[j];
}
}
/*
for(int i=1;i<=n;i++)
{
cout << a[i] << " ";
}
cout <<endl;
}
for(int i=1;i<=n;i++)
{
if(a[i])
{
count ++;
}
}
printf("%d\n",count);
*/
}
}
return 0;
}
Estrella's Travel
题目描述
Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有 n+1 座城市,编号依次为 0∼n ,Estrella住在 0 号城市,目的地是 n 号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶 m 个城市的距离。如果Estrella在某个城市(包括 n 号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少?
输入
多组数据输入。
每组数据第一行两个整数
n(1<n<1000),m(1≤m<n)
。
第二行
n
个整数
ai(0<ai≤1000)
,表示编号为
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以内,求最小的花费值;
思路:很明显的dp题目,不过还是贡献了2发WA,直接dp考虑一下边界的问题
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int INF = 1 << 29;
int a[1005],dp[1005];
int main()
{
int n,m,sum;
while(scanf("%d%d",&n,&m) != EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
dp[0] = 0;
for(int i=1;i<n;i++)
{
sum = INF;
if(i >= m)
{
for(int j=i-m;j<i;j++)
{
sum = min(sum,dp[j]);
}
dp[i] = sum + a[i];
}else {
for(int j=0;j<i;j++)
{
sum = min(sum,dp[j]);
}
dp[i] = sum + a[i];
}
}
printf("%d\n",dp[n]);
}
return 0;
}
Clock
题目描述
钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?
输入
第一行是一个整数 T(1≤T≤1440) ,表示样例的个数。 以后每行是一个时刻,格式为HH:MM。
输出
每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。
样例输入
2 00:01 00:30
样例输出
5.5 165
思路:直接套公式,如果时针大于12 做差,然后时针乘于30减去分针乘于5.5 h*30-m*5.5,取double值,注意最后与180比较 大于180要做差!!因为这个贡献了2发
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,a,b;
double h,m,ans;
while(scanf("%d",&n) != EOF)
{
while(n--)
{
scanf("%d:%d",&a,&b);
if(a >= 12)
{
a -= 12;
}
h = a * 30;
m = b * 5.5;
ans = fabs(h - m);
if(ans > 180.0)
{
ans = 360 - ans;
}
cout << ans << endl;
}
}
return 0;
}
分界线
还有两道题,想了很久都没有思路,不知道他到底是什么意思,所以一直没有去开后面两道题,后来结束了去找了一下题解看,
Balance
题目描述
小明有一架天平,小明想称出
1∼n
克的物品,请问最少需要几颗砝码?
比如小明想称出
1∼4
克的物品,需要2颗砝码,为1和3克。
输入
第一行是一个整数 T(1≤T≤10000) ,表示样例的个数。 以后每行一个样例,为一个整数 ( 1≤n≤109 )。
输出
每行输出一个样例的结果。
样例输入
3 1 4 40
样例输出
1 2 4
Different Digits
题目描述
有一个 n 位数 x ,每个数码都不一样,可你知道 x 的后 m(m<n) 位构成的整数 x′ ,请问满足条件最小的 x 是多少?
输入
第一行是一个整数 T(1≤T≤1000) ,表示样例的个数。 每个样例一行,为两个整数 n(2≤n≤10) 和 x 的后 m 位的整数 x′(0≤x′<987654321,x′没有前导0且所有数码都不一样) 。
输出
每行输出一个样例的结果。
样例输入
2 3 12 4 12
样例输出
312 3012
思路:当初的时候跟上一题差不多,这个是看出题意,却有点纠结不知道怎么下手,后来也是看了题解,即每个最高位数给能给的最小的数,然后标记一下
这题没有AC 代码候补……
分界线
总结:学校不给考四级,心情压抑,晚上做一下这种题,看到很多大神1小时左右AK了,真心觉得自己太水,高不成低不就,跟以前老师说的一样,有点眼高手低了,两道题连思路都没有,真心觉得自己太差了,题目数还是不够多,日后还需要恶补,浪费太多时间再无意义的事情上真是觉得没意思。额 至于这么迟补题解是因为接下来是考试月,很多科目要考察,一直在赶作业,所以题解来的迟,也提醒自己别什么都堆到最后,会导致挺多问题的。