2013吉林邀请

来源:互联网 发布:php array key 排序 编辑:程序博客网 时间:2024/04/28 20:56

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;}


 

 

0 0
原创粉丝点击