我只能说好卡啊。。。两点多交的题,比赛都结束了,结果还没判出来,晚上回来发现B题CE了。。但是我在本地也没什么问题啊,先在这里贴上部分自己做出的加补上的部分题解,以后把题补上慢慢完全。。。
Problem A: 两只老虎
Description
来,我们先来放松下,听听儿歌,一起“唱”。
两只老虎两只老虎,跑得快跑得快。
一只没有耳朵,一只没有尾巴。
真奇怪,真奇怪。
Tmk也觉得很奇怪,因为在他面前突然出现了一群这样的老虎,有的没耳朵,有的没尾巴,不过也有正常的。
现在Tmk告诉你这群老虎的耳朵个数,尾巴条数,以及老虎的腿的数目,问你有多少只是正常的。
其中只有三种老虎:
第一种(正常的):有2个耳朵、1条尾巴、4条腿
第二种(没耳朵):有0个耳朵、1条尾巴、4条腿
第三种(没尾巴):有2个耳朵、0条尾巴、4条腿
Input
第一行一个整数T表示有多少组样例。
接下来每一行一个样例:
包含三个整数a,b,c表示总共有a个耳朵,b条尾巴,c(<=4000)条腿,数据保证有解。
Output
对于每组样例输出一行,表示有多少只正常的老虎。
Sample Input
Sample Output
HINT
这就是个数学题,直接放代码吧
代码:#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 1000000+10
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",b+a/2-c/4);
}
return 0;
}
Problem B: 占点游戏
Description
众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:“我要跟你决一死战!”然后Maple就跟TMK玩起了一个关于占点的游戏。
Maple在一个无限展开的只有整数点的二维平面上找到两个点,由TMK和Maple分别操控这两个点,两人轮流操作,每一次操作中TMK或Maple可以把他的点移动一格到上、下、左、右四个方向,当TMK操作时,移动到的这个点会被染成红色,而当Maple操作时,移动到的这个点会被染成蓝色,需要注意的是,两个起始时的两个点也都会被染上相应的颜色,而当任一人走到已经染了不同颜色的点,这个颜色会被覆盖掉,当两个点覆盖在一起时,这个点会被后来的点染色。当游戏结束时染着自己颜色的点就代表被自己占领了。
TMK一下就明白了,这个游戏的目标是让自己占领的点比对方占领的点多,而且要让差值最大。
为了公平一些,Maple决定让TMK来选择先手或后手和让TMK来选择点,相应的Maple就会选择另一个点。
现在给出游戏的总轮数N,Maple选择的两个点的坐标(x1,y1),(x2,y2),要TMK来选择先后手和起始点,假设Maple一定按最优策略来走,问TMK能不能选择先后手和起始点使得自己占领的点比Maple占领的多,如果能,那么同时要求出占领的点数的最大差值。
Input
第一行一个T,代表接下来有T组数据(1<=T<=2000)。
每组数据有五个整数N,x1,y1,x2,y2,代表了操作的总轮数N以及选择的两个起始点(x1,y1),(x2,y2),其中1<=N<=10^8,-10^8<=x1,y1,x2,y2<=10^8,数据保证两个点不相同。
Output
对于每一组数据,如果TMK占领的点不能比Maple占领的多,那么输出-1,否则输出两个占领点数的最大差值。
Sample Input
Sample Output
HINT
代码:
传送门:http://blog.csdn.net/riba2534/article/details/67638566
Problem C: 爬楼梯
Description
小时候,我只能一阶一阶得爬楼梯,
后来,我除了能一次爬一阶,还可以一次爬两阶,
到现在,我最多一次可以爬三阶。
那么现在问题来了,我想爬上n层楼,相邻楼层之间有一段楼梯,虽然我一次可以爬1个台阶、2个台阶和3个台阶,但是我在i与i+1层之间的楼梯上时,我不能跨越到i+1与i+2层之间的楼梯。现在有个n层的楼,知道每一段楼梯的阶数,我想知道,如果我只会往上走,并且忽略其他不在楼梯上的其他移动,共有多少种方案可以到达第n层。
Input
第一行一个整数T(0<T<=50)表示有多少组样例。
对于每一组样例:
第一行一个n(1<n<=50)表示有多少层楼。
接下来一行,包括n-1个整数xi(0<xi<=20),由下到上依次表示每段楼梯的长度。
Output
对于每组数据,输出一行表示共有多少种方案。由于答案较大,所以输出答案请对10007取模。
Sample Input
Sample Output
HINT
利用dp的思想,先把每层的可能递推出来,然后利用sum乘以那些可能,就是最后的结果
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 1000000+10
#define ll long long
#define MOD 10007
using namespace std;
int a[70],dp[70];
int main()
{
int t;
dp[1]=1,dp[2]=2,dp[3]=4;
for(int i=4;i<=20;i++)
dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%MOD;
scanf("%d",&t);
while(t--)
{
int n,sum=1;
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
scanf("%d",&a[i]);
sum=(sum*dp[a[i]])%MOD;
}
printf("%d\n",sum);
}
return 0;
}
Problem D: 只有通过毁灭才能揭示真理
Description
“只有通过毁灭才能揭示真理。” —— 虚空之眼
维克兹是一个有触手的虚空来客,他带着非凡的意图探索着符文之地:吸收掉所有知识。凭借着他不断地注视,维克兹可以发射瓦解光线来灭除并分析他途中的一切东西,并为他供给数量庞大的信息。没人知道他为什么需要如此多的材料,尽管有人推测他设法了解符文之地,是为了加速它的毁灭。
另外,维克兹本身也是一个极其强大的魔法师,他的技能会对命中的敌人施加有机体解构效果。如果累积到3层效果,敌人就会受到爆发性的真实伤害。
现在,维克兹正准备施展他的绝招 —— 生命形态瓦解射线,来对付被永久眩晕且没有携带任何魔抗装备的约德尔人。另外,他的绝招每10秒就可以对敌人累积一层有机体解构效果。
维克兹希望找到能够跟他一起遨游大陆的伙伴,所以他准备考考你,如果已知生命形态瓦解射线持续的时间和每一秒的伤害,以及有机体解构效果每累积到3层所爆发的伤害(伤害爆发后层数归零),你是否能算出约德尔人受到的总伤害是多少呢?
请注意,如果你回答不出来,维克兹绝对很乐意将你一起分解掉。
Input
输入包括T组数据,每组数据包括生命形态瓦解射线的持续时间A,每一秒的伤害B,以及有机体解构效果每累积到3层所爆发的伤害C。
(T <= 10000, 0 <= A, B, C <= 10000, 所有数据皆为整数)
Output
输出一个数代表约德尔人受到的总伤害。
Sample Input
Sample Output
HINT
思路:
持续时间乘以每一秒造成的伤害,再加上他累计的三层爆发出的伤害就是最后答案,每十秒就有一次解构效果,所以就是a/30,然后再乘上爆发出来的伤害c
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 1000000+10
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
printf("%lld\n",a*b+a/30*c);
}
return 0;
}
Problem H: tmk买礼物
Description
今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下。
TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动。你先看看你有多少钱?”
TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]。
然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金券,假设你有四个硬币面值分别为1,2,4,100,你就可以凑成[0,7]里面所有的数,我们将会送你7元的代金券。现在就用你的硬币来试试吧。Enjoy yourself!”
在TMK努力凑钱的时候,店主想知道他要送多少代金券给TMK。
Input
第一行一个整数T,表示数据组数。
对于每组数据,首先读入一个整数n(n<=100000),然后接下来的一行有n个整数,表示a[i] (0<a[i]<=1e9)
Output
对于每个数据,输出一个整数x,表示店主要送x元的代金券给TMK
Sample Input
Sample Output
HINT
先排一下序,然后判断第一个数是不是1,不是1肯定不能组成。否则就找到第一个a[i]使得a[i]>a[i-1]+...a[0]+1,这个a[i]就是一定不能组成的
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define N 100000+20
#define M 1000000+10
#define ll long long
#define MOD 10007
using namespace std;
ll a[N];
int main()
{
int t,n;
scanf("%d",&t);
ll sum;
while(t--)
{
sum=0;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
int flag=0;
for(int i=1; i<=n; i++)
{
if(a[i]>sum+1)
{
flag=1;
printf("%lld\n",sum);
break;
}
sum+=a[i];
}
if(flag==0)
printf("%lld\n",sum);
}
return 0;
}
剩下的题解以后再补。。