Kattis, Kattis 的一些问题题解

题目链接

Thanos

题意

有T组数据,每组数据给你三个数P,R, F, P每年人数增长R倍,一个人一年吃1吨食物,每年有F吨食物而且多的不能留到下一年,问你可以这个星球离毁灭还有多少年?

思路

  • 我一开始用公式做,一直WA, 开始怀疑是精度的问题
  • 所有这种题目能直接暴力枚举就不要用公式 噫吁戱

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll P,R,F;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld%lld",&P,&R,&F);
		ll ans=0;
		while(P<=F)
		{
			ans++;
			P*=R; 
		}
		printf("%lld
",ans);
	}
	return 0;
}

题目链接

conquest campaign

题意

  • 你要攻打下R*C的地方,题目给出第一天攻打的几块格子,你接下来每天都可以在之前攻打下的地方的上下左右方向去攻打地方。问你需要多少天你才能攻打下所有地方。

注意事项

  • 注意更新今天攻打的对方的时候,不要因为今天其他攻打了的地方与这个地方相连而攻打了这个地方
  • 注意边界
  • 这块地能不能更新其他的地要 1,看这个地方是不是今天更新的 2,看这个地方是不是更新过

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;
int maze[MAXN][MAXN];
int r,c,n;
int ans=1;
bool judge(){
	bool flag=true;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			if(maze[i][j]!=(ans+1)&&maze[i][j]){
				if(i>1&&!maze[i-1][j]){
					maze[i-1][j]=ans+1;
					flag=false;
				}
				if(j>1&&!maze[i][j-1]){
					maze[i][j-1]=ans+1;
					flag=false;
				}
				if(j<c&&!maze[i][j+1]){
					maze[i][j+1]=ans+1;
					flag=false;
				}
				if(i<r&&!maze[i+1][j]){
					maze[i+1][j]=ans+1;
					flag=false;
				}
			}
			if(maze[i][j]==0){
				flag = false;
			}
		}
	}
	if(!flag)
		ans++;
	return flag;
}
int main()
{
	memset(maze,0,sizeof(maze));
	scanf("%d%d%d",&r,&c,&n);
	int x,y;
	ans=1;
	for(int i=1;i<=n;i++){
		scanf("%d%d",&x,&y);
		maze[x][y]=1;
	}
	while(!judge()){
	}
	printf("%d
",ans);
	return 0;
 } 

题目

hydrasheads

题意

  • hydra有h个头,t个尾巴,你可以进行四种操作
    • 砍一个头,生出一个头 (相当于没有操作)
    • 砍一个尾巴,生出两个尾巴 (相当于可以t+1)
    • 砍两个头 (h-2)
    • 砍两个尾巴,生出一个头 (h+1,t-2)
  • hydra不可能有负数个头和尾巴,(0,0)还可能生出头或者尾巴的话,也不算死。
  • 问你最少多少步可以杀死它

思路

  • dfs
  • 记忆化
  • 注意初始化

代码

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int ans=INF;
typedef pair<int,int> pa;
map<pa,int> dic;
int dfs(int h,int t){
	if(dic.count(make_pair(h,t)))	return dic[make_pair(h,t)];
	if(!t&&!(h&1)){
		dic[make_pair(h,t)]=(h>>1);
		return (h>>1);
	}
	int ret = INF;
	if(h<=2&&t<=2)	ret = min(ret,dfs(h,t+1));
	if(h>=2&&t>=0)	ret = min(ret,dfs(h-2,t));
	if(t>=2&&h>=0)	ret = min(ret,dfs(h+1,t-2));
	ret++;
	dic[make_pair(h,t)]=ret;
	return ret;	
}
int main()
{
	int h,t;
	while(scanf("%d%d",&h,&t)){
		dic.clear();
		dic[make_pair(2,0)]=1;
		dic[make_pair(1,0)]=INF;
		dic[make_pair(0,0)]=0;
		dic[make_pair(0,4)]=3;
		dic[make_pair(1,2)]=2;
		if(!h&&!t) break;
		ans=dfs(h,t);
		if(ans==INF) ans=-1;
		printf("%d
",ans);
	}
	return 0;
 } 
原文地址:https://www.cnblogs.com/xuwanwei/p/12880178.html