第二次周賽題解
阿新 • • 發佈:2018-12-18
//E題,不懂的看新生訓練題解 #include<stdio.h> int main() { double m; int n; while (~scanf("%lf%d", &m, &n)) { printf("%.*lf\n", n, m); } return 0; } //D題,一個預處理就ok #include<stdio.h> int a[1000005]; int main() { a[1]=1,a[2]=1; for(int i=3;i<=1000000;i++) { a[i]=(a[i-1]%1000000000+a[i-2]%1000000000)%1000000000; } int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); printf("%d\n",a[n]); } return 0; } //c題,打表找下規律,會發現是以1 1 2 0 2 2 1 0為迴圈 #include <stdio.h> int a[100]; int main() { a[1] = 1; a[2] = 1; for (int i = 3; i < 50; i++) { a[i] = (a[i - 1] + a[i - 2]) % 3; } long long n; while (~scanf("%lld", &n)) { n = n % 8; if (n == 0) n = 8; printf("%d\n", a[n]); } } /*A題 now表示已知現在袋子裡有多少物品 ma表示已知袋子裡最多有多少物品 三種情況: +id(這種情況明顯之前id不在袋子裡) now++,因為now增加了則ma=max(ma,now); -id(+id在之前出現過) now-- -id(+id在之前沒出現過,證明在放東西之前袋子裡已經有了id,所以取出後now不變ma則要加1) ma++,now不變 */ #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int v[1000005]; int main() { memset(v, 0, sizeof(v)); char s; int data, now, ma, n; now = ma = 0; scanf("%d", &n); while (n--) { scanf(" %c%d", &s, &data); if (s == '+') { now++; v[data] = 1; ma = max(ma, now); } else { if (v[data]) { now--; v[data] = 0; } else ma++; } } printf("%d\n", ma); return 0; } /*B題 sort一下,把沒分組的最大最小加起來如果<=w,就把他們分到一組,如果>w,最大的數就單獨一組 */ int a[30005]; int main() { int n, m, i, j, sum; scanf("%d", &n); scanf("%d", &m); for (i = 0; i < m; i++) scanf("%d", &a[i]); sort(a, a + m); i = sum = 0; j = m - 1; while (i <= j) { if (a[i] + a[j] <= n) { sum++; i++; j--; } else { sum++; j--; } } printf("%d\n", sum); return 0; }