解决方法同:http://blog.csdn.net/waitingandhopingv/article/details/22456391
在设计代码时,如还用上面方法, 1172ms
// [3/27/2014 Sjm]
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX_N = 100000;
int C, N;
struct node{
int x, y;
friend bool operator < (const node &n1, const node &n2) {
if (n1.y == n2.y) return n1.x > n2.x;
else return n1.y > n2.y;
}
};
void Solve(priority_queue<node> pri_que){
node n1 = pri_que.top();
pri_que.pop();
while (pri_que.size())
{
node n2 = pri_que.top();
pri_que.pop();
if (n1.y == n2.y) {
int myl = n1.x + 1, myr = n2.x;
if (myl == myr) {
printf("%d\n", myl);
return;
}
else {
for (int i = myl; i <= myr; i++){
printf("%d", i);
if (i != myr) printf(" ");
else printf("\n");
}
return;
}
}
n1 = n2;
}
printf("no sweets\n");
}
int main(){
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while (scanf("%d%d", &C, &N) && (C || N))
{
priority_queue<node> pri_que;
node n1;
n1.x = 0, n1.y = 0;
pri_que.push(n1);
int t, sum = 0;
for (int i = 0; i < N; i++){
scanf("%d", &t);
sum = (sum + t) % C;
n1.x = i + 1, n1.y = sum;
pri_que.push(n1);
}
Solve(pri_que);
}
return 0;
}
优化方法,增加标记 flag[MAX_N] ,829ms:
// [3/27/2014 Sjm]
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
using namespace std;
const int MAX_N = 100000;
int C, N, arr[MAX_N + 1];
void Solve(){
int l = 0, r = 0, sum = 0;
vector<int> flag(C, 0);
for (int i = 1; i <= N; i++) {
sum = (sum + arr[i]) % C;
if (0 == sum) {
l = 1;
r = i;
break;
}
else {
if (flag[sum]) {
l = flag[sum] + 1;
r = i;
break;
}
else flag[sum] = i;
}
}
for (int i = l; i <= r; i++) {
printf("%d", i);
if (i != r) printf(" ");
else printf("\n");
}
}
int main(){
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
while (scanf("%d%d", &C, &N) && (C || N))
{
for (int i = 1; i <= N; i++)
scanf("%d", &arr[i]);
Solve();
}
return 0;
}