2013吉林邀请

1001 Tutor

加起来除以12 保留2位小数 结尾0不要

我先扩大100倍 模拟一下进位看四舍五入后有几个0 在输出

#include <stdio.h>
int main()
{
    int t,i;
    double sum,x;
    scanf("%d",&t);
    while(t--)
    {
        int flag1 = 0;
        int flag2 = 0;
        sum = 0;
        for(i = 0; i < 12; i++)
        {
            scanf("%lf",&x);
            sum += x;
        }
        //sum = 12.894;
        sum /= 12;
        double s = sum;
        int k = sum *1000;
        k %= 10;
        if( k >= 5)
            sum += 0.01;
        k = sum * 100;
        k %= 10;
        if(k == 0)
            flag1 = 1;
        k = sum * 10;
        k %= 10;
        if(k == 0)
            flag2 = 1;
        if(!flag1)
            printf("$%.2f\n",s);
        else if(flag1 && !flag2)
            printf("$%.1f\n",s);
        else if(flag1 && flag2)
            printf("$%.0f\n",s);
    }
    return 0;
}


1004 D-City
从最后一条边开始做并查集 n-集合数

<span style="color:#000000;">#include <stdio.h>
const int MAX = 10010;
int bin[MAX];
struct node
{
    int u,v;
}a[MAX*10];

int find(int x)
{
    if(x != bin[x])
        return bin[x] = find(bin[x]);
    return bin[x];
}
void init(int n)
{
    for(int i = 0;i <= n; i++)
        bin[i] = i;
}
int main()
{
    int n,m;
    int i,j;
    int cnt = 0;
    int ans[MAX*10];
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(i = 0;i < m; i++)
        {
            scanf("%d %d",&a[i].u,&a[i].v);
        }
        init(n);
        cnt = 0;
        for(i = m - 1; i > 0; i--)
        {
            int x = find(a[i].u);
            int y = find(a[i].v);
            if(x != y)
            {
                bin[x] = y;
                cnt++;
            }
            ans[i] = n - cnt;
        }
        ans[m] = n;
        for(i = 1;i <= m; i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}</span>

1005 GCD and LCM

设gcd(x,y,z) = n lcm(x,y,z) = m; 那么设p = m/n(m%n != 0 无解)

将想x,y,z分别除以n 得到xx,yy,zz 因为去掉了最大公约数n 所以gcd(xx,yy,zz) = 1 , lcm(xx,yy,zz) = p = m / n;

对p分解因子 假设有a 个t1因子b个t2因子.....

因为gcd(xx,yy,zz) = 1 所以3个中有一个只有0个t1 有一个有a个t1剩下的可以有 0 ~ a个

1.不看0和a 因为3个数不同 有6中 有6*(a-1)中

2.再看0和a 有6种

所以有6*a中 这只是a因子的 b因子和a因子没有影响 所以种数是所有因子的情况相乘

#include <cstdio>
#include <cmath>
int main()
{
	int t,i;
	int n,m;
	int cnt;
	__int64 ans;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		if(m%n)
		{
			printf("0\n");
			continue;
		}
		m /= n;
		ans = 1;
		int k = sqrt(m) + 1;
		for(i = 2;i <= k; i++)
		{
			if(m == 1)
				break;
			cnt = 0;
			while(m % i == 0)
			{
				cnt++;
				m /= i;
			}
			if(cnt)
				ans *= 6*cnt;
		}
		if(m != 1)
			ans *= 6;
		printf("%I64d\n",ans);
	}
	return 0;
}

 

1007 Cannon

深搜 开始怕超时  然后就写了下31ms 过了

#include <cstdio>
#include <cstring>
int n,m,q;
int max;
int a[10][10];
int flag = 0;
bool check(int x,int y)
{
	int i;
	int cnt;
	cnt = 0;
	for(i = x-1;i >= 0; i--)
	{
		if(a[i][y])
		{
			if(a[i][y] == 2 && cnt == 1)
				return false;
			cnt++;
		}
		if(cnt > 1)
			break;
	}
	cnt = 0;
	for(i = y-1;i >= 0; i--)
	{
		if(a[x][i])
		{
			if(a[x][i] == 2 && cnt == 1)
				return false;
			cnt++;
		}
		if(cnt > 1)
			break;
	}
	return true;
}
void dfs(int l,int num)
{
	if(l == n * m)
	{
		if(max < num)
			max = num;
		return;
	}
	int x = l / m;
	int y = l % m;
	if(!a[x][y] && check(x,y))
	{
		a[x][y] = 2;
		dfs(l+1,num+1);
		a[x][y] = 0;
	}
	dfs(l+1,num);
}
int main()
{
	int i,j;
	int u,v;
	while(scanf("%d %d %d",&n,&m,&q)!=EOF)
	{
		memset(a,0,sizeof(a));
		for(i = 0;i < q; i++)
		{
			scanf("%d %d",&u,&v);
			a[u][v] = 1;
		}
		max = 0;
		dfs(0,0);
		printf("%d\n",max);
	}
	return 0;
}

1008 Play Game 

dp很弱 思路参考网上的 记忆化搜索

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 22;
int dp[MAX][MAX][MAX][MAX];
int a[MAX];
int suma[MAX];
int b[MAX];
int sumb[MAX];

int dfs(int s1,int e1,int s2,int e2)
{
	int &p = dp[s1][e1][s2][e2];
	if(p)
		return p;
	int temp = 0;
	if(s1 <= e1)
		temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1+1,e1,s2,e2));
	if(s1 <= e1)
		temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1-1,s2,e2));
	if(s2 <= e2)
		temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1,s2+1,e2));
	if(s2 <= e2)
		temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1,s2,e2-1));
	p = temp;
	return p;
}
int main()
{
	int t;
	int n;
	int i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i = 1;i <= n; i++)
		{
			scanf("%d",&a[i]);
			suma[i] = suma[i-1] + a[i];
		}
		for(i = 1;i <= n; i++)
		{
			scanf("%d",&b[i]);
			sumb[i] = sumb[i-1] + b[i];
		}
		memset(dp,0,sizeof(dp));
		printf("%d\n",dfs(1,n,1,n));
	}
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值