Age
原题链接: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年。
代码:#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,n,a,b,j,x,y;
scanf("%d",&n);
for(i=0;i<=99;i++)
{
int flag=0;
for(j=19;j<=20;j++)
{
if(i+j==n&&(i+j*100)<=2016)
{
flag=1;
break;
}
}
if(flag)
break;
}
printf("%d\n",2016-(j*100+i));
}
return 0;
}
Balance
Balance
题目描述
小明有一架天平,小明想称出
1∼n
克的物品,请问最少需要几颗砝码?
比如小明想称出
1∼4
克的物品,需要2颗砝码,为1和3克。
输入
第一行是一个整数 T(1≤T≤10000) ,表示样例的个数。 以后每行一个样例,为一个整数 ( 1≤n≤109 )。
输出
每行输出一个样例的结果。
样例输入
3 1 4 40
样例输出
1 2 4
ps:#include<stdio.h> #include<math.h> struct node { int x,y; }a[32]; void init() { for(int i=1;i<=31;i++) { a[i].x=(pow(3,i-1)+1)/2; a[i].y=(pow(3,i)-1)/2; } } int main() { init(); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=31;i++) { if(n>=a[i].x&&n<=a[i].y) { printf("%d\n",i); break; } } } return 0; }
当需要一个砝码时,砝码只能是1,那物品的质量只有为1时才满足。(满足条件的物品质量区间为(1,1))
当需要两个砝码时,我们可以推出此时使物品的质量最大且满足条件的砝码为1和3,物品的最大质量为4。(区间为(2,4))
当需要三个砝码时,也可以推出此时使物品的质量最大且满足条件的砝码为1,3,9,物品的最大质量为13。(区间为(5,13))
当需要四个砝码时,可以推出此时使物品的质量最大且满足条件的砝码为1,3,9,27,且物品的最大质量为40。(区间为(14,40))
.......
那么可以推得物品质量的区间为((3^(i-1)+1)/2,(3^i-1)/2)
那么打表就好了。。。
Clock
Clock
题目描述
钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?
输入
第一行是一个整数
T(1≤T≤1440)
,表示样例的个数。 以后每行是一个时刻,格式为HH:MM。
输出
每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。
样例输入
2
00:01
00:30
样例输出
5.5
165
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m,n;
scanf("%d:%d",&m,&n);
if(m>=12)
m-=12;
double x=m*30+n*0.5,y=n*6;
double ans=y-x;
if(ans<0)
ans=0-ans;
if(ans>180)
ans=360-ans;
if(ans==(int)ans)
printf("%d\n",(int)ans);
else
printf("%.1lf\n",ans);
}
return 0;
}
Different Digits
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
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char a[12],b[12];
bool vis[12];
memset(vis,true,sizeof(vis));
int n,i;
scanf("%d %s",&n,a);
int la=strlen(a);
for(i=0;i<la;i++)
{
vis[a[i]-'0']=false;
}
for(i=0;i<la;i++)
{
b[i+n-la]=a[i];
}
for(i=1;i<=9;i++)
{
if(vis[i])
{
b[0]=i+'0';
vis[i]=false;
break;
}
}
int cnt=1;
for(i=0;i<=9;i++)
{
if(cnt==n-la)
break;
if(vis[i])
b[cnt++]=i+'0';
}
for(i=0;i<n;i++)
printf("%c",b[i]);
printf("\n");
}
return 0;
}
Estrella's Travel
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。
代码:
#include<stdio.h>
#include<string.h>
#define min(a,b) (a<b?a:b)
#define INF 0x3f3f3f3f
int a[1010],dp[1010];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int i,j;
dp[0]=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
int cnt=INF;
if(i>=m)
{
for(j=i-m;j<i;j++)
cnt=min(cnt,dp[j]);
dp[i]=cnt+a[i];
}
else
{
for(j=0;j<i;j++)
cnt=min(cnt,dp[j]);
dp[i]=cnt+a[i];
}
}
printf("%d\n",dp[n]);
}
return 0;
}
ps:还是做题少啊
,以前dp只知道背包,现在才认识到真是太狭隘了,还是做题少,多刷题
。
Finally,Which light is on?
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是亮着的。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",(int)sqrt(n));
}
return 0;
}
ps:只要n开平方能得到整数,那么这个灯就是亮的
(比赛完看了一下,原来这么简单,,,多写几个例子就出来了,可是比赛时竟然只是看了看觉得写不出来就没写了
)
Gemstone Bracelet
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<stdio.h>
#define maxn 100000+10
#define max(a,b) (a>b?a:b)
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,i;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
int ans=0,cnt=0;
for(i=1; i<=m; i++)
cnt+=a[i];
for(i=1; i<=n; i++)
{
if(m+i>n)
cnt+=a[m+i-n];
else
cnt+=a[m+i];
cnt-=a[i];
ans=max(cnt,ans);
}
printf("%d\n",ans);
}
return 0;
}
总结一下这次比赛:
可能是这段时间一直在学新的算法再加上以前水题太少,导致现在碰见有些一看就是水题的题竟然要写好长时间,比如说这次比赛的d题,竟然写了一
个多小时,经常是没考虑清楚所有的情况就开始写,结果写着写着就写不出来了,最后修修改改浪费了好长时间。。。
-----接-下来经典水题不能放过啊,继续水起来