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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
解法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 }
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 }