課程結課了,把作的習題都記錄一下,告訴本身多少學了點東西,也能給本身一點鼓勵。ios
ps:題目都在cxsjsxmooc.openjudge.cn上能看到,參考答案在差很少結課的時候也會在mooc上放出來。c++
程序設計與算法(一)C語言程序設計 第一週習題(2019夏季)算法
001:輸出第二個整數編程
#include <iostream> #include <cstdio> using namespace std; int main(){ int a, b, c; cin >> a >> b >> c; cout << b; return 0; }
002:字符菱形ide
#include <iostream> #include <cstdio> using namespace std; int main(){ char c; scanf("%c", &c); printf(" %c\n", c); printf(" %c%c%c\n", c, c, c); printf("%c%c%c%c%c\n", c, c, c, c, c); printf(" %c%c%c\n", c, c, c); printf(" %c\n", c); return 0; }
003:打印ASCII碼函數
#include <iostream> #include <cstdio> using namespace std; int main(){ char c; scanf("%c", &c); printf("%d\n", c); return 0; }
004:打印字符測試
#include <iostream> #include <cstdio> using namespace std; int main(){ int c; scanf("%d", &c); printf("%c\n", c); return 0; }
005:整型數據類型存儲空間大小編碼
#include <iostream> #include <cstdio> using namespace std; int main(){ int a; short b; printf("%lu ", sizeof(a)); printf("%lu", sizeof(b)); return 0; }
006:浮點型數據類型存儲空間大小加密
#include <iostream> #include <cstdio> using namespace std; int main(){ float a; double b; printf("%lu ", sizeof(a)); printf("%lu", sizeof(b)); return 0; }
程序設計與算法(一)C語言程序設計 第二週習題(2019夏季)spa
001:對齊輸出
#include <iostream> #include <cstdio> using namespace std; int main(){ int a, b, c; scanf("%d %d %d", &a, &b, &c); printf("%8d %8d %8d", a, b, c); return 0; }
002:輸出保留12位小數的浮點數
#include <iostream> #include <cstdio> using namespace std; int main(){ double a; scanf("%lf", &a); printf("%.12lf", a); return 0; }
003:空格分隔輸出
#include <iostream> #include <cstdio> using namespace std; int main(){ char a; int b; float c; double d; scanf("%c", &a); scanf("%d", &b); scanf("%f", &c); scanf("%lf", &d); printf("%c ", a); printf("%d ", b); printf("%.6f ", c); printf("%.6lf", d); return 0; }
004:計算球的體積
#include <iostream> #include <cstdio> using namespace std; int main(){ double d; scanf("%lf", &d); printf("%.2lf", 4.0/3*3.14*d*d*d); return 0; }
005:大象喝水
#include <iostream> #include <cstdio> using namespace std; int main(){ int h, r; float c; scanf("%d %d", &h, &r); c = 3.14159*r*r*h; printf("%d", int(20000/c+1)); return 0; }
程序設計與算法(一)C語言程序設計 第三週習題(2019夏季)
001:奇偶數判斷
#include <iostream> #include <cstdio> using namespace std; int main(){ int a; cin >> a; if (a % 2){ cout << "odd"; }else{ cout << "even"; } return 0; }
002:求一元二次方程的根
#include <iostream> #include <cstdio> #include <cmath> using namespace std; #define EPS 1e-6 int main(){ double a, b, c; scanf("%lf %lf %lf", &a, &b, &c); double x1, x2, tmp; if (b*b-4*a*c > -EPS && b*b-4*a*c < EPS){ x1 = x2 = -b/(2*a); printf("x1=x2=%.5lf", x1); }else if (b*b-4*a*c >= EPS){ x1 = ((-b)+sqrt(b*b-4*a*c))/(2*a); x2 = ((-b)-sqrt(b*b-4*a*c))/(2*a); if (x1 < x2){ tmp = x1; x1 = x2; x2 = tmp; } printf("x1=%.5lf;x2=%.5lf", x1, x2); }else{ // 此處x1用來儲存實部係數,x2用來儲存虛部係數 x1 = -b/(2*a); x2 = sqrt(4*a*c-b*b)/(2*a); if (x1 < EPS && x1 > -EPS){ x1 = 0; } printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi", x1, x2, x1, x2); } return 0; }
003:點和正方形的關係
#include <iostream> #include <cstdio> using namespace std; int main(){ int x, y; scanf("%d %d", &x, &y); if (x <= 1 && x >= -1 && y <= 1 && y >= -1){ printf("yes"); }else{ printf("no"); } return 0; }
004:蘋果和蟲子2
#include <iostream> #include <cstdio> using namespace std; int main(){ int n, x, y; cin >> n >> x >> y; int a; if (y%x){ a = n-y/x-1; }else{ a = n-y/x; } if (a < 0){ a = 0; } cout << a; return 0; }
005:簡單計算器
#include <iostream> #include <cstdio> using namespace std; int main(){ int opd1, opd2; char opt; scanf("%d %d %c", &opd1, &opd2, &opt); int res; switch (opt){ case '+': res = opd1+opd2; printf("%d", res); break; case '-': res = opd1-opd2; printf("%d", res); break; case '*': res = opd1*opd2; printf("%d", res); break; case '/': if (!opd2){ printf("Divided by zero!"); }else{ res = opd1/opd2; printf("%d", res); } break; default: printf("Invalid operator!"); break; } return 0; }
006:求整數的和與均值
#include <iostream> #include <cstdio> using namespace std; int main(){ int n, sum; double ave; sum = 0; cin >> n; int i, tmp; for (i = 0; i < n; i++){ cin >> tmp; sum += tmp; } ave = 1.0*sum/n; printf("%d %.5f", sum, ave); return 0; }
007:整數序列的元素最大跨度值
#include <iostream> #include <cstdio> using namespace std; int main(){ int n; cin >> n; int max, min; max = 0; min = 1000; int i, tmp; for (i = 0; i < n; i++){ cin >> tmp; if (tmp > max){ max = tmp; } if (tmp < min){ min = tmp; } } cout << max - min; return 0; }
008:奧運獎牌計數
#include <iostream> #include <cstdio> using namespace std; int main(){ int n; scanf("%d", &n); int goldMedal, silverMedal, bronzeMedal; goldMedal = silverMedal = bronzeMedal = 0; int i, a, b, c; for (i = 0; i < n; i++){ scanf("%d %d %d", &a, &b, &c); goldMedal += a; silverMedal += b; bronzeMedal += c; } int totalMedal; totalMedal = goldMedal+silverMedal+bronzeMedal; printf("%d %d %d %d", goldMedal, silverMedal, bronzeMedal, totalMedal); return 0; }
009:乘方計算
#include <iostream> #include <cstdio> using namespace std; int main(){ int a, n, res; res = 1; scanf("%d %d", &a, &n); while (n > 0){ res *= a; n--; } printf("%d", res); return 0; }
010:雞尾酒療法
#include <iostream> #include <cstdio> using namespace std; int main(){ int n; cin >> n; double a[n]; int i, total, effective; for (i = 0; i < n; i++){ cin >> total >> effective; a[i] = 1.0*effective/total; } for (i = 1; i < n; i++){ if (a[i]-a[0] > 0.05){ cout << "better\n"; }else if (a[i]-a[0] < -0.05){ cout << "worse\n"; }else{ cout << "same\n"; } } return 0; }
程序設計與算法(一)C語言程序設計 第四周習題(2019夏季)
001:角谷猜測
#include <iostream> #include <cstdio> using namespace std; int main(){ long long n; scanf("%lld", &n); while (n > 1){ if (n%2){ printf("%lld*3+1=%lld\n", n, 3*n+1); n = 3*n+1; }else{ printf("%lld/2=%lld\n", n, n/2); n /= 2; } } printf("End"); return 0; }
002:正常血壓
#include <iostream> #include <cstdio> using namespace std; int main(){ int n; cin >> n; int max, tmp, systolicPressure, diastolicPressure; max = tmp = 0; int i; for (i = 0; i < n; i++){ cin >> systolicPressure >> diastolicPressure; if (systolicPressure <= 140 && systolicPressure >= 90 && diastolicPressure <= 90 && diastolicPressure >= 60){ tmp++; if (tmp > max){ max = tmp; } }else{ tmp = 0; } } cout << max; return 0; }
003:數字反轉
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int n; scanf("%d", &n); int sign = 1; if (n < 0){ sign = -1; n = -n; } int rev = 0; while (n > 0){ rev = rev*10 + n%10; n /= 10; } rev = sign*rev; printf("%d", rev); return 0; }
004:求特殊天然數
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int n10, n7, n9; int a[3], b[3], tmpA, tmpB, i, j; for (n10 = 81; n10 < 343; n10++){ tmpA = tmpB = n10; i = j = 2; while (tmpA > 0){ a[i] = tmpA%7; tmpA /= 7; i--; } while (tmpB > 0){ b[j] = tmpB%9; tmpB /= 9; j--; } if (a[0] == b[2] && a[1] == b[1] && a[2] == b[0]){ break; } } cout << n10 << "\n" << a[2]+a[1]*10+a[0]*100 << "\n" << b[2]+b[1]*10+b[0]*100; return 0; }
005:僱傭兵
#include <iostream> #include <cstdio> using namespace std; #define MAXSIZE 10 int main(int argc, char const *argv[]) { int M, N, X; cin >> M >> N >> X; while (N*X >= M){ X -= M/N+1; N += M/N; } printf("%d", N); return 0; }
006:數字統計
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int a, b; cin >> a >> b; int i, tmp, counter; counter = 0; for (i = a; i <= b; i++){ int t = i; while (t>0){ tmp = t%10; t /= 10; if (tmp == 2){ counter++; } } } cout << counter; return 0; }
程序設計與算法(一)C語言程序設計 第五週習題(2019夏季)
001:與指定數字相同的數的個數
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int n; scanf("%d", &n); int a[n], i; for (i = 0; i < n; i++){ scanf("%d", &a[i]); } int specifiedNumber; scanf("%d", &specifiedNumber); int counter = 0; for (i = 0; i < n; i++){ if (a[i] == specifiedNumber){ counter++; } } printf("%d", counter); return 0; }
002:陶陶摘蘋果
#include <iostream> #include <cstdio> using namespace std; #define MAXSIZE 10 int main(int argc, char const *argv[]) { int height[MAXSIZE]; int i; int counter = 0; for (i = 0; i < MAXSIZE; i++){ cin >> height[i]; } int taotao; int bench = 30; cin >> taotao; for (i = 0; i < 10; i++){ if (height[i] <= taotao + bench){ counter++; } } cout << counter; return 0; }
003:年齡與疾病
#include <iostream> #include <cstdio> using namespace std; #define MAXSIZE 10 int main(int argc, char const *argv[]) { int n; scanf("%d", &n); int a[n], i, counter18, counter35, counter60, counterOther; counter18 = counter35 = counter60 = counterOther = 0; for (i = 0; i < n; i++){ scanf("%d", &a[i]); if (a[i] <=18 ){ counter18++; }else if (a[i] <= 35){ counter35++; }else if (a[i] <= 60){ counter60++; }else{ counterOther++; } } printf("%.2f%%\n", 100.0*counter18/n); printf("%.2f%%\n", 100.0*counter35/n); printf("%.2f%%\n", 100.0*counter60/n); printf("%.2f%%\n", 100.0*counterOther/n); return 0; }
004:校門外的樹
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int L, M; scanf("%d %d", &L, &M); int a[L+1], tmpA, tmpB, i; for (i = 0; i < L+1; a[i++] = 1) ; for (i = 0; i < M; i++){ scanf("%d %d", &tmpA, &tmpB); int j; for (j = tmpA; j <= tmpB; a[j++] = 0) ; } int counter = 0; for (i = 0; i < L+1; i++){ if (a[i] == 1){ counter++; } } printf("%d", counter); return 0; }
005:計算鞍點
#include <iostream> #include <cstdio> using namespace std; #define MAXLINE 5 #define MAXROW 5 int main(int argc, char const *argv[]) { int a[MAXLINE][MAXROW], i, j, lmax, max[MAXLINE]; for (i = 0; i < MAXLINE; i++){ cin >> a[i][0]; lmax = a[i][0]; max[i] = 0; for (j = 1; j < MAXROW; j++){ cin >> a[i][j]; if (a[i][j] > lmax){ lmax = a[i][j]; max[i] = j; } } } int found = 1; for (i = 0; i < MAXLINE; i++){ for (j = 0; j < MAXLINE; j++){ if (a[j][max[i]] < a[i][max[i]]){ found = 0; } } if (found){ break; }else if (i == MAXLINE-1){ break; } else{ found = 1; } } if (found){ cout << i+1 << " " << max[i]+1 << " " << a[i][max[i]]; }else{ cout << "not found"; } return 0; }
006:圖像模糊處理
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int m, n; scanf("%d %d", &m, &n); int a[m][n], b[m][n], i, j; for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ scanf("%d", &a[i][j]); b[i][j] = a[i][j]; } } for (i = 1; i < m-1; i++){ for (j = 1; j < n-1; j++){ b[i][j] = (2*(a[i][j-1]+a[i][j+1]+a[i][j]+a[i-1][j]+a[i+1][j])+5)/10; } } for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ printf("%d ", b[i][j]); } printf("\n"); } return 0; }
007:矩陣轉置
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int m, n; cin >> m >> n; int a[m][n], i, j; for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ cin >> a[i][j]; } } for (j = 0; j < n; j++){ for (i = 0; i < m; i++){ cout << a[i][j] << " "; } cout << endl; } return 0; }
程序設計與算法(一)C語言程序設計 第六週習題(2019夏季)
001:Pell數列
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int n; scanf("%d", &n); int a[1000000]; a[0] = 1; a[1] = 2; int i; for (i = 2; i < 1000000; i++){ a[i] = 2*a[i-1]+a[i-2]; if (a[i] > 32767){ a[i] %= 32767; } } int b[n]; for (i = 0; i < n; i++){ scanf("%d", &b[i]); } for (i = 0; i < n; i++){ printf("%d\n", a[b[i]-1]%32767); } return 0; }
002:求最大公約數問題
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int a, b, tmp; cin >> a >> b; do{ tmp = a%b; a = b; b = tmp; }while (tmp); cout << a; return 0; }
003:編程填空:第i位替換
return 1<<i&m|~(1<<i)&n;
004:編程填空:第i位取反
return 1<<i^n;
005:編程填空:左邊i位取反
return ~0<<32-i^n;
程序設計與算法(一)C語言程序設計 第七週習題(2019夏季)
001:統計數字字符個數
#include <iostream> #include <cstdio> using namespace std; int main(int argc, char const *argv[]) { int counter = 0, c; while ((c = getchar()) != '\n'){ if (c >= '0' && c <= '9'){ counter++; } } cout << counter; return 0; }
002:找第一個只出現一次的字符
#include <iostream> #include <cstdio> using namespace std; char a[100000]; int b[26]; int main(int argc, char const *argv[]) { int i; for (i = 0; i < 26; i++){ b[i] = 0; } cin >> a; // int c; // while ((c = getchar()) != '\n'){ // b[c-'a']++; // } for (i = 0; a[i]; i++){ b[a[i]-'a']++; } for (i = 0; a[i]; i++){ if (b[a[i]-'a'] == 1){ cout << a[i]; break; } } if (a[i] == '\0'){ cout << "no"; } return 0; }
003:石頭剪子布
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int stoi(char *s); int main(int argc, char const *argv[]) { char player1S[10], player2S[10]; int player1I, player2I, N; scanf("%d", &N); int i, a[N]; for (i = 0; i < N; i++){ scanf("%s %s", player1S, player2S); player1I = stoi(player1S); player2I = stoi(player2S); int t = player1I - player2I; if (t == 0){ a[i] = 0; }else if (t == -1 || t == 2){ a[i] = 1; }else{ a[i] = -1; } } for (i = 0; i < N; i++){ if (a[i] == -1){ printf("%s\n", "Player2"); }else if (a[i] == 1){ printf("%s\n", "Player1"); }else{ printf("%s\n", "Tie"); } } return 0; } int stoi(char *s){ int p; if (!strcmp(s, "Rock")) p = -1; else if (!strcmp(s, "Scissors")) p = 0; else p = 1; return p; }
004:最長最短單詞
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAXSIZE 20000 #define MAXWORDSIZE 100 #define IN 1 #define OUT 0 char s[MAXSIZE]; char longest[MAXWORDSIZE]; char shortest[MAXWORDSIZE]; char tmp[MAXWORDSIZE]; int main(int argc, char const *argv[]) { gets(s); int state = OUT, max = -1, min = MAXWORDSIZE+1, len; int i = 0, j = 0; while (1){ if (s[i] == ' ' || s[i] == ',' || !s[i]){ if (state == IN){ tmp[j] = '\0'; j = 0; len = strlen(tmp); if (len > max){ max = len; strcpy(longest, tmp); } if (len < min){ min = len; strcpy(shortest, tmp); } if (!s[i]){ break; } }else{ i++; continue; } state = OUT; i++; } tmp[j++] = s[i++]; state = IN; } printf("%s\n", longest); printf("%s\n", shortest); return 0; }
005:密碼翻譯
#include <iostream> #include <cstdio> using namespace std; #define MAXSIZE 80 char s[MAXSIZE]; int main(int argc, char const *argv[]) { cin.getline(s, MAXSIZE); int i; for (i = 0; s[i]; i++){ if (s[i] == 'z'){ s[i] = 'a'; }else if (s[i] == 'Z'){ s[i] = 'A'; }else if (s[i] >= 'a' && s[i] <= 'y' || s[i] >= 'A' && s[i] <= 'Y'){ s[i] += 1; } } cout << s; return 0; }
程序設計與算法(一)C語言程序設計 第8、九周習題(2019夏季)
001:指針練習:輸出Hello
p = s; *p; p++
002:指針練習:輸出Tesla
; *p1 != *p2; p1++
003:指針練習:ForEach
void (*f)(void *)
004:指針練習:Memcpy之一
int i; for (i = 0; i < n; i++){ dest[i] = src[i]; }
005:指針練習:double
a[1], 6
006:指針練習:Memcpy之二
char *sourceCode = (char*)src; char *destination = (char*)dest; char b[size], i; for (i = 0; i < size; i++){ b[i] = *sourceCode++; } char *tmp = b; for (i = 0; i < size; i++){ *destination++ = *tmp++; }
007:指針練習:MyMax
void *MyMax(void *anArray, int sizeOfAnItem, int numberOfItem, int (*comparisonFunction)(void *n1, void*n2)){ char *tmp = (char*)anArray; int i; void *max = anArray; for (i = 0; i < numberOfItem; i++){ if (comparisonFunction(tmp, max) > 0){ max = tmp; } tmp = tmp+sizeOfAnItem; } return max; }
008:指針練習:指向指針的指針
int **p = a;
009:指針練習:SwapMemory
char *a1 = (char*)m1; char *a2 = (char*)m2; char c; int i; for (i = 0; i < size; i++){ c = *a1; *a1++ = *a2; *a2++ = c; }
程序設計與算法(一)C語言程序設計 第十週習題(2019夏季)
001:成績排序
#include <iostream> #include <cstdio> #include <cstring> using namespace std; struct student{ char name[20]; int score; }; int main(){ int n; scanf("%d", &n); int i; struct student a[20]; for (i = 0; i < n; i++){ scanf("%s %d", &a[i].name, &a[i].score); } struct student tmp; int j, index; for (i = 0; i < n; i++){ tmp = a[i]; index = i; for (j = i; j < n; j++){ if (a[j].score > tmp.score){ tmp = a[j]; index = j; }else if (a[j].score == tmp.score){ if (strcmp(tmp.name, a[j].name) > 0){ tmp = a[j]; index = j; } } } a[index] = a[i]; a[i] = tmp; } for (i = 0; i < n; i++){ printf("%s %d\n", a[i].name, a[i].score); } return 0; }
002:分數線劃定
#include <iostream> #include <cstdio> using namespace std; struct candidate{ int ID; int score; }; int main(){ int n, m; scanf("%d %d", &n, &m); int i; struct candidate a[n]; for (i = 0; i < n; i++){ scanf("%d %d", &a[i].ID, &a[i].score); } struct candidate tmp; int j, index; for (i = 0; i < n; i++){ tmp = a[i]; index = i; for (j = i; j < n; j++){ if (a[j].score > tmp.score){ tmp = a[j]; index = j; }else if (a[j].score == tmp.score){ if (a[j].ID < tmp.ID){ tmp = a[j]; index = j; } } } a[index] = a[i]; a[i] = tmp; } int t = m*3/2-1; tmp = a[t]; int boundary = a[t].score; while (tmp.score == boundary){ t++; tmp = a[t]; } printf("%d %d\n", boundary, t); for (i = 0; i < t; i++){ printf("%d %d\n", a[i].ID, a[i].score); } return 0; }
003:病人排隊
#include <iostream> #include <cstdio> #define BOUNDARY 60 using namespace std; struct patient{ char ID[10]; int age; }; int main(){ int n; scanf("%d", &n); int i; struct patient a[n]; for (i = 0; i < n; i++){ scanf("%s %d", &a[i].ID, &a[i].age); } struct patient tmp; int j, index; for (i = 0; i < n; i++){ for (j = n-1; j > i; j--){ if (a[j].age >= BOUNDARY){ if (a[j-1].age < a[j].age){ tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } } for (i = 0; i < n; i++){ printf("%s\n", a[i].ID); } return 0; }
004:mysort
void mysort(void *t, int numberOfElement, unsigned int widthOfElement, int(*fCompare)(const void *, const void *)){ int i, j, k; char *p = (char*)t; char tmp; for (i = 0; i < numberOfElement; i++){ for (j = numberOfElement-1; j > 0; j--){ char *a, *b; a = p+(j)*widthOfElement; b = p+(j-1)*widthOfElement; if (fCompare(a, b) < 0){ for (k = 0; k < widthOfElement; k++){ tmp = *a; *a++ = *b; *b++ = tmp; } } } } return; }
005:從字符串中取數
static char *start; if (str){ start = str; } double f = 0;; for (; *start < '0' || *start > '9'; start++){ if (*start == '\0'){ return -1; } } for (; *start >= '0' && *start <= '9'; start++){ f = 10*f+(*start-'0'); } if (*start == '.'){ int tmp = 1; start++; for (; *start >= '0' && *start <= '9'; start++){ f = 10*f+(*start-'0'); tmp *= 10; } f /= tmp; } return f;
程序設計與算法(一)C語言程序設計 第十一週習題(2019夏季)
001:派
#include <iostream> #include <cstdio> #define PI 3.141592653589793 #define EPS 0.00001 using namespace std; int main () { int N, F; scanf("%d %d", &N, &F); int i, radius[N]; double volume[N]; double totalVolume = 0; for (i = 0; i < N; i++){ scanf("%d", &radius[i]); volume[i] = PI*radius[i]*radius[i]; totalVolume += volume[i]; } double maxVolume = totalVolume/(F+1); double left = 0, right = maxVolume, mid; while (right-left >= EPS){ mid = left+(right-left)/2; int k = 0; for (i = 0; i < N; i++){ k += volume[i]/mid; } if (k >= F+1){ maxVolume = mid; left = mid+EPS; }else{ right = mid-EPS; } } printf("%.3f\n", maxVolume); return 0; }
002:月度開銷
#include <iostream> #include <cstdio> #define PI 3.141592653589793 #define EPS 0.00001 using namespace std; int main () { int N, M; scanf("%d %d", &N, &M); int i, cost[N], sum = 0, min, max = 0; for (i = 0; i < N; i++){ scanf("%d", &cost[i]); sum += cost[i]; if (cost[i] > max){ max = cost[i]; } } min = sum; int left = max, right = sum, mid; while (left <= right){ mid = left+(right-left)/2; int tmp = 0, numberOfFajomonth = 1; for (i = 0; i < N; i++){ tmp += cost[i]; if (tmp > mid){ tmp = cost[i]; numberOfFajomonth++; }else if (tmp == mid){ tmp = 0; numberOfFajomonth++; } } if (numberOfFajomonth > M){ left = mid+1; }else{ if (mid < min){ min = mid; } right = mid-1; } } printf("%d\n", min); return 0; }
003:Aggressive cows
#include <iostream> #include <cstdio> #include <algorithm> #define MAXLENGTH 1000000000 using namespace std; int main () { int N, C; scanf("%d %d", &N, &C); int i, stall[N]; for (i = 0; i < N; i++){ scanf("%d", &stall[i]); } sort(stall, stall+N); int left = 1, right = MAXLENGTH/C, mid; int max = 1; while (left <= right){ mid = left+(right-left)/2; int j, k = 0; for (j = C; j-1 && k < N; j--){ int t = stall[k]+mid; k++; while (k < N && stall[k] < t){ k++; } } if (j > 1){ right = mid-1; }else{ if (k >= N){ right = mid-1; }else{ if (mid > max){ max = mid; } left = mid+1; } } } printf("%d\n", max); return 0; }
程序設計與算法(一)C語言程序設計 第十二週習題(2019夏季)
001:sort簡單題
a+1, a+7, greater<int>()
002:仍是sort簡單題
struct Rule1{ bool operator()(const int & a1, const int & a2){ if (a1%10 != a2%10){ return a1%10 < a2%10; }else{ return a1>a2; } } }; struct Rule2{ bool operator()(const Point & a1, const Point & a2){ int t1, t2; t1 = a1.x*a1.x+a1.y*a1.y; t2 = a2.x*a2.x+a2.y*a2.y; if (t1 != t2){ return t2>t1; }else{ if (a1.x != a2.x){ return a2.x>a1.x; }else{ return a2.y>a1.y; } } } };
003:Set
#include <iostream> #include <set> #include <cstring> using namespace std; struct od{ char a[4]; int b; }; int main() { multiset<int> st; multiset<int> st_cpy; int n; scanf("%d", &n); int i; struct od order[n]; for (i = 0; i < n; i++){ scanf("%s %d", order[i].a, &order[i].b); } for (i = 0; i < n; i++){ if (strcmp(order[i].a, "add") == 0){ st.insert(order[i].b); st_cpy.insert(order[i].b); multiset<int>::iterator j; int t = 0; for (j = st.begin(); j != st.end(); j++){ if (*j == order[i].b){ t++; } } printf("%d\n", t); } if (strcmp(order[i].a, "del") == 0){ multiset<int>::iterator cs; int t = 0; for (cs = st.begin(); cs != st.end(); cs++){ if (*cs == order[i].b){ t++; } } st.erase(order[i].b); printf("%d\n", t); } if (strcmp(order[i].a, "ask") == 0){ int ever; multiset<int>::iterator k; k = st_cpy.find(order[i].b); if (k == st_cpy.end()){ ever = 0; }else{ ever = 1; } printf("%d ", ever); multiset<int>::iterator j; int t = 0; for (j = st.begin(); j != st.end(); j++){ if (*j == order[i].b){ t++; } } printf("%d\n", t); } } return 0; }
004:熱血格鬥場
#include <iostream> #include <set> #include <cstring> #include <cstdlib> using namespace std; struct member{ int ID; long long power; }; struct rule{ bool operator()(const struct member & a1, const struct member a2){ return a1.power < a2.power; } }; struct competition{ int freshmanID; int membershID; }; struct member minp(struct member a, struct member b, struct member c); int main() { set<struct member, rule> st; int n; scanf("%d", &n); struct member a[n+1], tmpA, tmpB, tmp; struct competition c[n]; a[0].ID = 1; a[0].power = 1000000000; st.insert(a[0]); int i; set<struct member, rule>::iterator j; for (i = 1; i < n+1; i++){ scanf("%d %lld", &a[i].ID, &a[i].power); j = st.lower_bound(a[i]); tmpA.power = j->power; tmpA.ID = j->ID; tmpB = tmpA; if (j != st.begin()){ j--; tmpB.power = j->power; tmpB.ID = j->ID; } tmp = minp(tmpA, tmpB, a[i]); c[i-1].freshmanID = a[i].ID; c[i-1].membershID = tmp.ID; st.insert(a[i]); } for (i = 0; i < n; i++){ printf("%d %d\n", c[i].freshmanID, c[i].membershID); } return 0; } struct member minp(struct member a, struct member b, struct member c){ int t1, t2; t1 = abs(c.power-a.power); t2 = abs(c.power-b.power); if (t1 >= t2){ return b; }else{ return a; } }
程序設計與算法(一)C語言程序設計 第十三週習題(2019夏季)
001:冷血格鬥場
#include <iostream> #include <map> #include <cstring> #include <cstdlib> using namespace std; struct competition{ int freshmanID; int memberID; }; int main() { map<long long, int> st; int n; scanf("%d", &n); st[1000000000] = 1; struct competition c[n]; int i, id; long long power, diff1, diff2; map<long long, int>::iterator j, jtmp; for (i = 1; i < n+1; i++){ scanf("%d %lld", &id, &power); j = st.lower_bound(power); if (j == st.end()){ j--; } diff1 = abs(j->first-power); jtmp = j; diff2 = diff1; if (j != st.begin()){ j--; diff2 = abs(j->first-power); } if (diff1 > diff2 || diff1 == diff2 && jtmp->second > j->second){ jtmp = j; } c[i-1].freshmanID = id; c[i-1].memberID = jtmp->second; if (jtmp->first == power && jtmp->second < id){ ; }else{ st[power] = id; } } for (i = 0; i < n; i++){ printf("%d %d\n", c[i].freshmanID, c[i].memberID); } return 0; }
程序設計與算法(一)C語言程序設計 期末考試(2019夏季)
01:分段函數
#include <iostream> #include <cstdio> #define EPS 0.000001 using namespace std; int main(){ double x, y; scanf("%lf", &x); if (x>-EPS && x-5 < -EPS){ y = -x+2.5; }else if (x-5 > -EPS && x-10 < -EPS){ y = 2-1.5*(x-3)*(x-3); }else if (x-10 > -EPS && x-20 < -EPS){ y = x/2-1.5; } printf("%.3f", y); return 0; }
02:求分數序列和
#include <iostream> #include <cstdio> using namespace std; int main(){ double sum = 0; int n, p = 1, q = 2, tmp; scanf("%d", &n); for (int i = 0; i < n; i++){ sum += 1.0*q/p; tmp = q; q = q+p; p = tmp; } printf("%.4f", sum); return 0; }
03:畫矩形
#include <iostream> #include <cstdio> using namespace std; int main(){ int height, width, isFilled; char fc; scanf("%d %d %c %d", &height, &width, &fc, &isFilled); for (int i = 0; i < height; i++){ if (isFilled){ for (int j = 0; j < width; j++){ printf("%c", fc); } }else{ if (i == 0 || i == height-1){ for (int j = 0; j < width; j++){ printf("%c", fc); } }else{ for (int j = 0; j < width; j++){ if (j == 0 || j == width-1){ printf("%c", fc); }else{ printf(" "); } } } } printf("\n"); } return 0; }
04:求出e的值
#include <iostream> #include <cstdio> using namespace std; int main(){ double e = 1; int n; long long factorial; scanf("%d", &n); for (int i = 1; i <= n; i++){ factorial = 1; for (int j = 1; j <= i; j++){ factorial *= j; } e += 1.0/factorial; } printf("%.10f", e); return 0; }
05:計算多項式的值
#include <iostream> #include <cstdio> using namespace std; int main(){ float x, polynomial = 1, product = 1; int n; scanf("%f %d", &x, &n); for (int i = 1; i <= n; i++){ product *= x; polynomial += product; } printf("%.2f", polynomial); return 0; }
06:大整數加法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char a[210], b[210], c[210]; void reverse(char *s); void plusHugeInt(char *a, char *b, char *sum); void printHugeInt(char *s); int main(){ cin >> a >> b; reverse(a); reverse(b); plusHugeInt(a, b, c); printHugeInt(c); return 0; } void reverse(char *s){ int len = strlen(s), tmp; int i = 0, j = len-1; while (i < j){ tmp = s[i]; s[i] = s[j]; s[j] = tmp; i++; j--; } return; } void plusHugeInt(char *a, char *b, char *c){ int lenA = strlen(a), lenB = strlen(b); int i, jw = 0, sum; for (i = 0; i < lenA && i < lenB; i++){ sum = a[i]-'0'+b[i]-'0'+jw; c[i] = sum%10+'0'; jw = sum/10; } while (i < lenA){ sum = a[i]-'0'+jw; c[i] = sum%10+'0'; jw = sum/10; i++; } while (i < lenB){ sum = b[i]-'0'+jw; c[i] = sum%10+'0'; jw = sum/10; i++; } if (jw == 1){ c[i++] = '1'; } c[i] = '\0'; return; } void printHugeInt(char *s){ int j = -1, lenS = strlen(s); for (int i = 0; i < lenS; i++){ if (s[i]-'0' > 0){ j = i; } } if (j == -1 ){ printf("0"); }else{ s[j+1] = '\0'; for (int k = strlen(s)-1; k >= 0; k--){ printf("%c", s[k]); } } return; }
07:有趣的跳躍
#include <iostream> #include <cstdlib> using namespace std; int main(){ int n; cin >> n; if (n == 1){ printf("Jolly"); }else{ int a[n], difference[n-1], check[n-1], isJolly = 1; for (int i = 0; i < n; i++){ cin >> a[i]; } for (int i = 0; i < n-1; i++){ check[i] = 0; difference[i] = abs(a[i]-a[i+1]); } for (int i = 0; i < n-1; i++){ if (difference[i] == 0 || difference[i] > n-1){ break; }else{ check[difference[i]-1] = 1; } } for (int i = 0; i < n-1; i++){ if (check[i] == 0){ printf("Not jolly"); isJolly = 0; break; } } if (isJolly){ printf("Jolly"); } } return 0; }
08:單詞倒排
#include <iostream> #include <cstring> #define MAXSIZE 100 using namespace std; char s[MAXSIZE]; char *p[MAXSIZE]; int main(){ for (int i = 0; i < MAXSIZE; i++){ p[i] = NULL; } cin.getline(s, MAXSIZE); char *tmp; tmp = strtok(s, " "); int i = 0; while (tmp){ p[i++] = tmp; tmp = strtok(NULL, " "); } for (int j = i-1; j >= 0; j--){ cout << p[j] << " "; } return 0; }
09:行程長度編碼
#include <iostream> #include <cstring> #include <cctype> #define MAXSIZE 1000 using namespace std; struct charAndNumber{ char c; int n; }; char s1[MAXSIZE]; struct charAndNumber s2[MAXSIZE]; int main(){ cin >> s1; for (int i = 0; i < MAXSIZE; i++){ s2[i].c = '\0'; s2[i].n = 0; } s2[0].c = toupper(s1[0]); s2[0].n++; int len = strlen(s1), j = 0; for (int i = 1; i < len; i++){ if (s1[i] == s2[j].c || s1[i]+'A'-'a' == s2[j].c){ s2[j].n++; }else{ j++; s2[j].c = toupper(s1[i]); s2[j].n++; } } for (int i = 0; i <= j; i++){ cout << "(" << s2[i].c << "," << s2[i].n << ")"; } return 0; }
10:反反覆覆
#include <iostream> #include <cstring> #define MAXSIZE 200 using namespace std; char s[MAXSIZE]; int main(){ int line, row; cin >> row >> s; line = strlen(s)/row; for (int i = 0; i < row; i++){ int k = i; /* 注意題目中並非把字符串從上到下地一列一列填成的矩陣按每行 從左到右輸出,而是一行從左到右,一行從右到左。因此獲得的加密後 的字符串,能夠把從右到左輸出的部分先顛倒,再把一個矩陣一行一行 輸出。若是不想作顛倒這一步,就能夠像下面這樣,一行輸出整數第a個, 下一行輸出倒數第a個。 */ for (int j = 0; j < line; j++){ printf("%c", s[j*row+k]); k = row-1-k; } } return 0; }
11:網線主管
#include <cstdio> using namespace std; /* 這題一開始用的double,怎麼都不行,有的時候本身電腦上能夠,傳上去也不行, 實在是沒法理解,不知道怎麼用double的變量來作。我是隻能統統乘100用整數來了 */ int main(){ int N, K; scanf("%d %d", &N, &K); int a[N]; /* 注意,單位用釐米時,全部的都乘100,和sum用8字節的int可能就不夠了。 我有個測試數據過不了就是由於這個。 */ long long sum = 0; double tmpA; for (int i = 0; i < N; i++){ scanf("%lf", &tmpA); a[i] = tmpA*100; sum += a[i]; } /* 枚舉+二分法 */ /* 注意,left不能用0,否則下面a[i]/mid的時候,除數可能爲0,就出錯了, 有個測試數據過不了就是由於一開始left是0。我電腦上的提示是 float exception:8。反正就是出錯。何況題目中要求若是小於max小於1就輸出0.00, 因此也left也不必設置成1如下的。 */ int left = 1, right = sum/K, mid, max = 0; int tmp; while (left <= right){ mid = left+(right-left)/2; tmp = 0; for (int i = 0; i < N; i++){ tmp += a[i]/mid; } if (tmp >= K){ max = mid; left = mid+1; }else{ right = mid-1; } } if (max < 1){ printf("0.00"); }else{ printf("%.2f", 1.0*max/100); } return 0; }
12:查找最接近的元素
#include <iostream> using namespace std; int main(){ int n, m; cin >> n; int a[n]; for (int i = 0; i < n; i++){ cin >> a[i]; } cin >> m; int test, left, right, mid, l, r; for (int i = 0; i < m; i++){ cin >> test; left = 0; right = n-1; l = a[0]; r = a[n-1]; while (left <= right){ mid = left+(right-left)/2; if (a[mid] > test){ r = a[mid]; right = mid-1; }else{ l = a[mid]; left = mid+1; } } if (l == test){ printf("%d\n", l); }else{ if (test-l <= r-test){ printf("%d\n", l); }else{ printf("%d\n", r); } } } return 0; }
13:1的個數
#include <iostream> using namespace std; int main(){ int N; cin >> N; int n = N, cnt = 0; for (int i = 0; i < 32; i++){ if (n&1 == 1){ cnt++; } n >>= 1; } printf("%d", cnt); return 0; }
14:判斷元素是否存在
#include <iostream> #include <cstdio> #define MAXSIZE 100000 using namespace std; int main(){ long long a[MAXSIZE]; int k, x; int isFind = 0; scanf("%d,%d", &k, &x); a[0] = k; for (int i = 1; i < MAXSIZE; i++){ if (i%2 == 1){ a[i] = 2*a[(i+1)/2-1]+1; }else{ a[i] = 3*a[(i+1)/2-1]+1; } } for (int i = 0; i < MAXSIZE; i++){ if (a[i] == x){ isFind = 1; break; } } if (isFind){ printf("YES"); }else{ printf("NO"); } return 0; }