我觉得我可以继续wa下去(手动魔鬼笑)--------------------------------------------
原题链接:https://ac.nowcoder.com/acm/contest/12986/J
示例1
输入
5 1 5 2 3 4 1
输出
0 0 0 0 0
示例2
输入
6 1 1 1 4 5 1 4
输出
0 0 3 4 0 3
题意
给定n个数, 每次操作使所有正整数-1, 直到没有任何一个数==k
思路
我们的目的是把所有>=k的数操作完后!=k, 那......找到大家减去的数就可了
另开个数组, 排序, 先找到==k的地方, 后面只要是a[i]-a[i-1]==1, 就res ++;(res为最后所有数减去的值)
如果有间断使得a[i]-a[i-1]>1, 那么停止进行, res就不再变了.
a[i]-a[i-1]==0没事, 继续continue计算res就行
出错点
对>=k的数操作就行, 我当时是对整体从头开始操作的, 然而, 队友都过了, 这个题, 呜呜呜, 只有我没过
代码
#include <iostream> #include <algorithm> using namespace std; const int N = 1e6 + 10; int a[N], b[N]; int main() { int n, k, res; cin >> n >> k; for(int i = 0; i < n; i ++) cin >> a[i], b[i] = a[i]; sort(b, b + n); res = 0; int l = n; for(int i = 0; i < n; i ++) if(b[i] == k) { l = i; res++;//找到了k, 那么就得先-1, 咱总不能找到了最后减去的是0吧 break; } for(int i = l; i < n-1; i ++) if(b[i+1] - b[i] == 1) res ++; else if(b[i+1]!=b[i]) break; for(int i = 0; i < n; i ++) { cout << max(0, a[i] - res);//小于0那输出0, 题目要求 if(i != n-1) printf(" "); } return 0; }