POJ

1003  Hangover

 1 #include<stdio.h>
 2 int main()
 3 {
 4     double c, cur_len;
 5     scanf_s("%lf", &c);
 6     while (1)
 7     {
 8         if (c < 0.0001)
 9             break;
10         cur_len = 1.0 / 2;
11         int count = 1;
12         while (cur_len<c)
13         {
14             count++;
15             cur_len += 1.0 / (count + 1);
16         }
17         printf("%d card(s)\n", count);
18         scanf_s("%lf", &c);
19     }
20     return 0;
21 }
View Code

1004  Financial Management

 1 /*
 2     水题,求平均数
 3     注意小数点后保留两位即可
 4 */
 5 #include<stdio.h>
 6 int main()
 7 {    
 8     int i;
 9     double sum=0, num,result;
10     for (i = 0; i < 12; i++)
11     {
12         scanf_s("%lf", &num);
13         sum += num;
14     }
15     printf("$%.2lf\n", sum / 12);
16     return 0;
17 }
View Code

1005  I Think I Need a Houseboat

 1 /*
 2     注意每年累加的是面积,不是半径,半径会越来越小
 3 */
 4 #include<stdio.h>
 5 #include<math.h>
 6 #define pi 3.141592
 7 int main()
 8 {
 9     int N;
10     double X, Y,Z;
11     scanf_s("%d", &N);
12     int count = 1;
13     while (N--)
14     {
15         scanf_s("%lf%lf", &X, &Y);
16         Z = pi*(X*X + Y*Y) / 100;
17         printf("Property %d: This property will begin eroding in year %d.\n", count, int(Z+1));
18         ++count;
19     }
20     printf("END OF OUTPUT.\n");
21     return 0;
22 }
View Code

1006  Biorhythms

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {    int p,e,i,d,j,no=1;
 5     cin>>p>>e>>i>>d;
 6     while(p!=-1 && e!=-1 && i!=-1 && d!=-1)
 7     {    for(j=d+1;j<=21252;j++)
 8             if((j-p)%23==0)
 9                 break;
10         for(;j<=21252;j=j+23)
11             if((j-e)%28==0)
12                 break;
13         for(;j<=21252;j=j+23*28)
14             if((j-i)%33==0)
15                 break;
16         cout<<"Case "<<no;
17         cout<<": the next triple peak occurs in ";
18         cout<<j-d<<" days."<<endl;
19         cin>>p>>e>>i>>d;
20         no++;
21     }
22     return 0;
23 }
View Code

1007  DNA Sorting

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 struct dna
 5 {
 6     int num;
 7     string s;
 8 }DNA[100];
 9 int inversionNum(string s)
10 {
11     int ans = 0,len;
12     int A, C, G;
13     A = C = G = 0;
14     len = s.length();
15     for (int i = len - 1; i >= 0; i--)
16     {
17         switch (s[i])
18         {
19         case 'A':
20             A++;
21             break;
22         case 'C':
23             C++;
24             ans += A;
25             break;
26         case 'G':
27             G++;
28             ans += A;
29             ans += C;
30             break;
31         case 'T':
32             ans += A;
33             ans += C;
34             ans += G;
35         }
36     }
37     return ans;
38 }
39 int cmp(const void *a, const void *b)
40 {
41     return (*(dna*)a).num > (*(dna*)b).num ? 1 : -1;
42 }
43 int main()
44 {
45     int n, m, i;
46     cin >> n >> m;
47     for (i = 0; i < m; i++)
48     {
49         cin >> DNA[i].s;
50         DNA[i].num = inversionNum(DNA[i].s);
51     }
52     qsort(DNA,m,sizeof(DNA[0]),cmp);
53     for (i = 0; i < m; i++)
54         cout << DNA[i].s << '\n';
55     return 0;
56 }
View Code

1008  Maya Calendar

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 string m[19] = {"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax",
 5                 "zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};
 6 string d[20] = {"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok",
 7                 "chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
 8 int search(string hm)
 9 {
10     for (int i = 0; i < 19; i++)
11         if (hm == m[i])
12             return i;
13 }
14 int main()
15 {
16     int n,hd,hy,hm1,hdays,ty,days;
17     string hm;
18     cin >> n;
19     cout << n << endl;
20     while (n--)
21     {
22         cin >> hd >> hm >> hm >> hy;
23         hm1 = search(hm);
24         hdays = hy * 365 + hm1 * 20 + hd ;
25         ty = hdays / 260;
26         days = hdays % 260;
27         cout << days % 13+1 << " " << d[days % 20] << " " << ty << endl;
28     }
29     return 0;
30 }
View Code

1017  Packets

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {    int b1,b2,b3,b4,b5,b6; //不同大小的木块个数
 5     int nTotal=0; //最少需要的箱子数目
 6     int c1; //当前能放1*1木块的空格数目
 7     int c2; //当前能放2*2木块的空格数目
 8     int Contain2[4]={0,5,3,1};
 9     while(1)
10     {    cin>>b1>>b2>>b3>>b4>>b5>>b6;
11         if(b1==0 && b2==0 && b3==0 && b4==0 && b5==0 && b6==0)
12             break;
13         nTotal=b6+b5+b4+(b3+3)/4;
14         c2=5*b4+Contain2[b3%4];
15         if(b2>c2)    nTotal+=(b2-c2+8)/9;
16         c1=36*nTotal-36*b6-25*b5-16*b4-9*b3-4*b2;
17         if(b1>c1)    nTotal+=(b1-c1+35)/36;
18         cout<<nTotal<<endl;
19     }
20     return 0;
21 }
View Code

1083  Moving Tables

 1 /* 
 2     方法:记录每个房间前的走廊被用过多少次,答案为10*次数
 3     注意范围的确定,若下限为偶数,则下限需减1,若上限为奇数,则上限需加1
 4     例如,s=4,t=7时,房间4到房间7之间的走廊都要占用,而房间4前的走廊与房间3前的走廊是一样的,
 5     房间7前与房间8前的走廊也是一样的,所以要扩大的更新范围为[3,8]
 6 */
 7 
 8 #include<cstdio>
 9 #include<cstdlib>
10 #include<iostream>
11 using namespace std;
12 int cmp(const void *a, const void *b)
13 {
14     return *(int *)a > *(int *)b ? 1 : -1;
15 }
16 int main()
17 {
18     int T,N,s,t,i,j,temp;
19     int room[400];
20     scanf_s("%d", &T);
21     while (T--)
22     {
23         memset(room, 0, sizeof(room));//注意每次测试都要初始化,而不是在输入测试次数前初始化
24         scanf_s("%d", &N);
25         for (i = 0; i < N; i++)
26         {
27             scanf_s("%d%d", &s, &t);
28             if (s > t)
29             {
30                 temp = s;
31                 s = t;
32                 t = temp;
33             }
34             if (s % 2 == 0)  
35                 s--;
36             if (t % 2 != 0)
37                 t++;
38             for (j = s; j <t; j+=2)
39                 room[j]++;
40         }
41         qsort(room, 400, sizeof(room[0]), cmp);
42         printf("%d\n", 10*room[399]);
43     }
44     return 0;
45 }
View Code

1088  滑雪

 1 #include<iostream>
 2 using namespace std;
 3 int map[101][101] = { 0 };//存原始数据
 4 int r, c;//行数,列数
 5 int dp[101][101] = { 0 };//存储节点的最长路径值
 6 int dfs(int from, int to)
 7 {
 8     //如果已经记录了值,直接返回
 9     if (dp[from][to] > 0)
10         return dp[from][to];
11     int zuo=0, you=0, shang=0, xia=0;
12     //处理下路,并剪枝
13     if (from + 1 <= r)
14     {
15         if (map[from + 1][to] < map[from][to])
16             xia = 1 + dfs(from + 1, to);
17         else
18             xia = 1;
19     }
20     else
21         xia = 1;
22     //处理上路,并剪枝
23     if (from - 1 > 0)
24     {
25         if (map[from - 1][to] < map[from][to])
26             shang = 1 + dfs(from - 1, to);
27         else
28             shang = 1;
29     }
30     else
31         shang = 1;
32     //处理右路,并剪枝
33     if (to + 1 <= c)
34     {
35         if (map[from][to + 1] < map[from][to])
36             you = 1 + dfs(from, to + 1);
37         else
38             you = 1;
39     }
40     else
41         you = 1;
42     //处理左路,并剪枝
43     if (to - 1 > 0)
44     {
45         if (map[from][to - 1] < map[from][to])
46             zuo = 1 + dfs(from, to - 1);
47         else
48             zuo = 1;
49     }
50     else
51         zuo = 1;
52     //返回最大值
53     if (zuo < you)
54         zuo = you;
55     if (zuo < shang)
56         zuo = shang;
57     if (zuo < xia)
58         zuo = xia;
59     return zuo;
60 }
61 int main()
62 {
63     int i, j;
64     cin >> r >> c;
65     for (i = 1; i <= r; i++)
66         for (j = 1; j <= c; j++)
67             cin >> map[i][j];
68     int ans = 0;
69     for (i = 1; i <= r; i++)
70         for (j = 1; j <= c; j++)
71         {
72             //记录每个节点的最长路径
73             dp[i][j] = dfs(i, j);
74             //选出最大长度
75             if (ans < dp[i][j])
76                 ans = dp[i][j];
77         }
78     cout << ans << endl;
79     return 0;
80 }
View Code

1258  Agri-Net (最小生成树)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MaxInt 100000
 4 #define N 101
 5 //创建map二维数组存储图表,low数组记录每2个点间的最小权值,
 6 //visited数组记录某点是否已访问
 7 int map[N][N], low[N], visited[N];
 8 int n;
 9 int prim()
10 {
11     int i, j, pos, min, result=0;
12     memset(visited, 0, sizeof(visited));
13     //从某点开始,分别标记和记录该点
14     visited[1] = 1;
15     pos = 1;
16     //第一次给low数组赋值
17     for (i = 1; i <= n; i++)
18             low[i] = map[pos][i];
19     //再运行n-1次
20     for (i = 1; i < n; i++)
21     {
22         min = MaxInt;
23         //找出最小权值并记录位置
24         for(j = 1; j <= n; j++)
25             if (visited[j] == 0 && min > low[j])
26             {
27                 min = low[j];
28                 pos = j;
29             }
30         //最小权值累加
31         result += min;
32         //标记该点
33         visited[pos] = 1;
34         //更新权值
35         for (j = 1; j <= n; j++)
36             if (visited[j] == 0 && low[j] > map[pos][j])
37                 low[j] = map[pos][j];
38     }
39     return result;
40 }
41 int main()
42 {
43     int i, j;
44     while (scanf_s("%d", &n) != EOF)
45     {
46         for (i = 1; i <= n; i++)
47             for (j = 1; j <= n; j++)
48                 scanf_s("%d", &map[i][j]);
49         printf("%d\n", prim());
50     }
51     return 0;
52 }
View Code

1328  Radar Installation(贪心)

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdlib>
 4 using namespace std;
 5 struct point
 6 {    
 7     double left, right;
 8 }p[1001];
 9 int cmp(const void *a, const void *b)
10 {    
11     return (*(point *)a).left> (*(point *)b).left ? 1 : -1;
12 }
13 int main()
14 {
15     int i,n,d,count = 0,y;
16     double dist,x;
17     bool flag;
18     while (cin >> n >> d && n != 0 && d != 0)
19     {
20         count++;
21         flag = false;
22         if (d <0)  flag = true;
23         for (i = 0; i < n; i++)
24         {
25             cin >> x >> y;
26             if (abs(y) <= d)
27             {
28                 //计算区间
29                 dist = sqrt(double(d*d - y*y));
30                 p[i].left = x - dist;
31                 p[i].right = x + dist;
32             }
33             else
34                 flag = true;
35         }
36         if (flag)
37         {
38             cout << "Case " << count << ": -1"<<endl ;
39             continue;
40         }
41         qsort(p,n,sizeof(p[0]),cmp);//排序
42         x = p[0].right; 
43         int m = 1;//雷达个数初始化为1
44         //寻找最少区间个数
45         for (i = 1; i < n; i++)
46         {
47             if (p[i].left > x)
48             {
49                 m++;
50                 x= p[i].right;
51             }
52             else
53             {
54                 if (p[i].right < x)
55                     x= p[i].right;//更新右端点
56             }
57         }
58         cout << "Case " << count << ": " << m << endl; 
59     }
60     return 0;
61 }
View Code

1331  Multiply

 1 #include<stdio.h>
 2 #include<string.h>
 3 int b2ten(int x,int b);
 4 int main()
 5 {    int p,q,r,n,b;
 6     scanf("%d",&n);
 7     while(n--)
 8     {    scanf("%d%d%d",&p,&q,&r);
 9         for(b=2;b<=16;b++)
10         {    long p2=b2ten(p,b);
11             long q2=b2ten(q,b);
12             long r2=b2ten(r,b);
13             if(p2==-1||q2==-1||r2==-1)    continue;
14             if(p2*q2==r2)    { printf("%d\n",b); break; }
15         }
16         if(b==17)    printf("0\n");
17     }
18     return 0;
19 }
20 int b2ten(int x,int b)
21 {    char tmp[100];
22     int ret=0;
23     sprintf(tmp,"%d",x);
24     int len=strlen(tmp);
25     for(int i=0;i<len;i++)
26     {    if(tmp[i]-'0'>=b)    return -1;
27         ret*=b;
28         ret+=tmp[i]-'0';
29     }
30     return ret;
31 }
View Code

1503  Integer Inquiry

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int sum[102] = {0};
 6     char s[101];
 7     int i, j, len, c;
 8     gets_s(s);
 9     while (1)
10     {
11         if (s[0] == '0' && strlen(s) == 1)
12             break;
13         len = strlen(s);
14         c = 0;
15         for (i = len - 1, j = 0; i >= 0; i--, j++)
16         {
17             sum[j] += s[i]-'0' + c;
18             c = sum[j] / 10;
19             sum[j] = sum[j] % 10;
20         }
21         while (c > 0)
22         {
23             sum[j] += c;
24             c = sum[j] / 10;
25             sum[j] = sum[j] % 10;
26             j++;
27         }
28         gets_s(s);
29     }
30     i = 101;
31     while (sum[i] == 0)
32         i--;
33     while (i >= 0)
34         printf("%d", sum[i--]);
35     printf("\n");
36     return 0;
37 }
View Code

2080  Calendar

 1 #include<stdio.h>
 2 int type(int);   /*判断是否为闰年*/
 3 char week[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
 4 int year[2]={365,366};   /*year[0]表示非闰年的天数,year[1]表示闰年的天数。*/
 5 int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
 6                   31,29,31,30,31,30,31,31,30,31,30,31};
 7 /*month[0]表示非闰年里每个月的天数,month[1]表示闰年里每个月的天数。*/
 8 int main()
 9 {    int days,dayofweek;  /*days表示输入的天数,dayofweek表示星期几。*/
10     int i,j;
11     while(scanf("%d",&days)&&days!=-1)
12     {    dayofweek=days%7;
13         for(i=2000;days>=year[type(i)];i++)
14             days-=year[type(i)];
15         for(j=0;days>=month[type(i)][j];j++)
16             days-=month[type(i)][j];
17         printf("%d-%02d-%02d %s\n",i,j+1,days+1,week[dayofweek]);
18     }
19     return 0;
20 }
21 int type(int m)
22 {    if(m%4!=0||(m%100==0&&m%400!=0))
23         return 0;
24     else return 1;
25 }
View Code

2159  Ancient Cipher

解法1: //Time  16MS

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {    
 7     int i;
 8     int x[26], y[26];
 9     memset(x, 0, sizeof(x));
10     memset(y, 0, sizeof(y));
11     string input;
12     cin >> input;
13     for (i = 0; i < input.length(); i++)
14     {
15         x[input[i] - 'A']++;
16     }
17     cin >> input;
18     for (i = 0; i < input.length(); i++)
19     {
20         y[input[i] - 'A']++;
21     }
22     sort(x, x + 26);
23     sort(y, y + 26);
24     for (i = 0; i < 26; i++)
25         if (x[i] != y[i])
26         {
27             cout << "NO" << endl;
28             return 0;
29         }
30     cout << "YES" << endl;
31     return 0;
32 }
View Code

解法2: //Time   0MS

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int cmp(const void *a, const void *b)
 4 {
 5     return *(int *)a > *(int *)b?1:-1;
 6 }
 7 int main()
 8 {
 9     int i;
10     int x[26], y[26];
11     char input[101];
12     for (i = 0; i < 26; i++)
13         x[i] = y[i] = 0;
14     gets_s(input);
15     for (i = 0; input[i]; i++)
16         x[input[i] - 'A']++;
17     gets_s(input);
18     for (i = 0; input[i]; i++)
19         y[input[i] - 'A']++;
20     qsort(x, 26, sizeof(x[0]), cmp);
21     qsort(y, 26, sizeof(y[0]), cmp);
22     for (i = 0; i < 26;i++)
23         if (x[i] != y[i])
24         {
25             printf("NO\n");
26             return 0;
27         }
28     printf("YES\n");
29     return 0;
30 }
View Code

3069  Saruman's Army(贪心)

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 int x[1001],N,R;
 5 void solve()
 6 {
 7     for (int i = 0; i < N; i++)
 8         scanf_s("%d",&x[i]);
 9     sort(x, x + N);
10     int i = 0,ans=0;
11     while (i < N)
12     {
13         //s是没有被覆盖的最左的点的位置
14         int s = x[i++];
15         //一直向右前进直到距s的距离大于R的点
16         while (i < N && x[i] <= s + R)
17             i++;
18         //p是新加上标记的点的位置
19         int p = x[i - 1];
20         //一直向右前进直到距p的距离大于R的点
21         while (i < N && x[i] <= p + R)
22             i++;
23         ans++;
24 
25     }
26     printf("%d\n",ans);
27 }
28 int main()
29 {
30     while (scanf_s("%d%d", &R, &N) != EOF)
31     {
32         if (N != -1 && R != -1)
33             solve();
34         else
35             break;
36     }
37     return 0;
38 }
View Code


 

posted @ 2015-04-01 11:32  夏弥  阅读(573)  评论(0编辑  收藏  举报