intmain(void) { int x; cin >> x; int res = x / 4; int a = 0, b = 0, c; // for 6 5 4 int remainder = x % 4; switch (remainder) { case0: c = res; break; case1: { b++; c = res - 1; } break; case2: { a++; c = res - 1; } break; case3: { b++; a++; c = res - 2; } break; default:
break; } cout << a << " " << b << " " << c << endl; return0; }
intmain(void) { int n; cin >> n; int q[n]; int min = 20000; int max = -20000; for (int i = 0; i < n; i++) { cin >> q[i]; if (q[i] < min) min = q[i]; if (q[i] > max) max = q[i]; } cout << max - min;
for (int i = 0; i < n; i++) { cin >> q[i]; } // i定位新的数字,,j定位这个数字的最后一个出现的下标 int i = 0; int length = 0; while (i < n) { int j = i; while (j < n && q[j] == q[i]) j++; // while循环结束时,j == n或者j指向第一个和q[i]不相同的数字 if (j - i > length) length = j - i; i = j;//i指向新的数值 } cout << length; return0; }
int times[max + 1] = {0}; // times数组,记录q里面每个数字出现的频次,没出现过就是零次
但是我后来发现原因不在这,
个人错误1
把
1 2 3 4 5 6 7 8 9 10 11 12
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时times数组的下标 while (i < max + 1) { if (times[i] >= 1) { res[k] = i; k++; i++; } else i++;//这里前往别写成i++和k++ }
写成了
1 2 3 4 5 6 7 8 9 10
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时times数组的下标 while (i < max + 1) { if (times[i] >= 1) res[k] = i; k++; i++;//这里前往别写成i++和k++ }
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时times数组的下标 while (i < max + 1) { if (times[i] >= 1) { res[k] = i; k++; i++; } else i++;//这里前往别写成i++和k++ }
不准给我写成这样,哪怕下面这种写法也是对的.
1 2 3 4 5 6 7 8 9
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时times数组的下标 while (i < max + 1) { if (times[i] >= 1) res[k++] = i; i++;//这里前往别写成i++和k++ }
// 我有两种想法,第一种时开times数组,记录q里面每个数字出现的频次 intmain(void){ int n; cin >> n; int q[n]; int max = 0; for (int i = 0; i < n; i++) { cin >> q[i]; if (max < q[i]) max = q[i]; } // 找到整个数组里面的最大值max int times[max + 1] = {0}; // times数组,记录q里面每个数字出现的频次,没出现过就是零次 for (int i = 0; i < n; i++) times[q[i]]++;
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时times数组的下标 while (i < max + 1) { if (times[i] >= 1) { res[k] = i; k++; i++; } else i++;//这里前往别写成i++和k++ } for (int j = 0; j < k; j++) cout << res[j] << " ";
return0; }
因此要修改成这样才对
1 2 3 4 5 6 7 8 9 10 11 12 13
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时q数组的下标 while (i < n) { if (times[q[i]] >= 1) { res[k] = q[i]; times[q[i]] = 0;//不让q[i]里面数值相同的数拷贝两边到res[]数组里面 k++; i++; } else i++;//这里前往别写成i++和k++ }
// 我有两种想法,第一种时开times数组,记录q里面每个数字出现的频次 intmain(void){ int n; cin >> n; int q[n]; int max = 0; for (int i = 0; i < n; i++) { cin >> q[i]; if (max < q[i]) max = q[i]; } // 找到整个数组里面的最大值max int times[max + 1] = {0}; // times数组,记录q里面每个数字出现的频次,没出现过就是零次 for (int i = 0; i < n; i++) times[q[i]]++;
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时q数组的下标 while (i < n) { if (times[q[i]] >= 1) { res[k] = q[i]; times[q[i]] = 0;//不让q[i]里面数值相同的数拷贝两边到res[]数组里面 k++; i++; } else i++;//这里前往别写成i++和k++ } for (int j = 0; j < k; j++) cout << res[j] << " ";
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时q数组的下标 while (i < n) { if (times[q[i]] >= 1) { res[k] = q[i]; times[q[i]] = 0;//不让q[i]里面数值相同的数拷贝两边到res[]数组里面 k++; i++; } else i++;//这里前往别写成i++和k++ }
把这个改成后面那种形式
1 2 3 4 5 6 7 8 9 10 11
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时q数组的下标 for (; i < n; i++) { if (times[q[i]] >= 1) { res[k] = q[i]; times[q[i]] = 0;//不让q[i]里面数值相同的数拷贝两边到res[]数组里面 k++; } }
// 我有两种想法,第一种时开times数组,记录q里面每个数字出现的频次 intmain(void){ int n; cin >> n; int q[n]; int max = 0; for (int i = 0; i < n; i++) { cin >> q[i]; if (max < q[i]) max = q[i]; } // 找到整个数组里面的最大值max int times[max + 1] = {0}; // times数组,记录q里面每个数字出现的频次,没出现过就是零次 for (int i = 0; i < n; i++) times[q[i]]++;
int res[n]; // res数组存放去重后的结果 // 将times数组里面大于等于一的元素对应的下标,就是q数组的元素 int k = 0; // k是res数组的小标 int i = 0; // i时q数组的下标 for (; i < n; i++) { if (times[q[i]] >= 1) { res[k] = q[i]; times[q[i]] = 0;//不让q[i]里面数值相同的数拷贝两边到res[]数组里面 k++; } } for (int j = 0; j < k; j++) cout << res[j] << " ";
#include<iostream> usingnamespace std; voidtran(int x, int m); char tranChars[] = "0123456789ABCDEF"; intmain(void) { int x, m; cin >> x >> m; // cout << tranChars[15]; tran(x, m); return0; } voidtran(int x, int m) { if (x == 0)//一开始的时候没看懂这里他是怎么想到特判的,,其实就是递归的终止条件,任何时候一想到递归就想到第一步就写递归的终止条件 return; int tmp; tmp = x / m; tran(tmp, m); cout << tranChars[x % m]; }
intmain(void) { int n; cin >> n; int a, b; int q[n] = {0}; for (int i = 0; i < n; i++) { cin >> a >> b; if ((90 <= a && a <= 140) && (60 <= b && b <= 90)) q[i] = 1; } // 判断q[],1代表正常 // 刚好用上今天学的双指针模板,我来尝试一波 // 好像用不上双指针模板,但我这个写法也算是双指针吧,感觉差不多 int i, j; int hour = 0; while (i < n && j < n) { while (i < n && q[i] == 0) i++; if (i < n && j < n) j = i; while (j < n && q[j] == 1) j++; if (j - i > hour) // 这里不能加i < n && j < n,因为j最后都是1 的话,j会指向最后元素的后面一个位置,此时的j - i还是合法的 hour = j - i; if (i < n && j < n) i = j; } cout << hour; // 答案错了,那我这题就留着做吧 return0; }