这题(T4)我赛后不论是同学把代码下下来然后用官方数据跑了评测还是洛谷上交都是35(裸暴力30+判-1后面有一个点应该是),为什么查成绩发现没有分是0呢,这种可以申诉吗?如果要申诉理由怎样写呢?
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxk=11;
const int mod=1e9+7;
int w[maxk];
int n,k;
int maxx[11],minn[11],real[11];
int now[11]={1,1,1,1,1,1,1,1,1,1,1},tmp[11]={1,1,1,1,1,1,1,1,1,1,1};
bool nex(){
tmp[k]++;
int nn=k;
while(tmp[nn]>w[nn]){
tmp[nn]=1;
tmp[nn-1]++;
nn--;
if(nn==0)return 0;
}
return 1;
}
long long ans;
const int maxn=5e5+7;
int c[maxn],d[maxn];
int main(){
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
scanf("%d%d",&c[i],&d[i]);
real[c[i]]+=d[i];
maxx[c[i]]=max(maxx[c[i]],real[c[i]]);
minn[c[i]]=min(minn[c[i]],real[c[i]]);
}
bool cant=1;
for(int i=1;i<=k;i++){
if(!(maxx[i]-minn[i]<w[i]&&real[i]==0)){
cant=0;
break;
}
}
if(cant){
cout<<-1;
return 0;
}
do{
int mins=10000000;
bool can=1;
for(int i=1;i<=k;i++)now[i]=tmp[i];
for(int i=1;i<=k;i++){
if(now[i]+maxx[i]>w[i]||now[i]+minn[i]<1){
can=0;
break;
}
if(real[i]==0)continue;
mins=min(mins,real[i]>0?(w[i]-now[i]-maxx[i])/real[i]:abs((now[i]+minn[i])/(-real[i])));
}
for(int i=1;i<=k;i++){
now[i]+=can*mins*real[i];
}
ans=(ans+mins*n*can)%mod;
bool hh=1;
for(int i=1;i<=n;i++){
now[c[i]]+=d[i];
ans++;
ans%=mod;
if(now[c[i]]>w[c[i]]||now[c[i]]<=0){hh=0;break;}
}
if(hh){
for(int i=1;i<=n;i++){
now[c[i]]+=d[i];
ans++;
ans%=mod;
if(now[c[i]]>w[c[i]]||now[c[i]]<=0)break;
}
}
}while(nex());
printf("%lld",ans%mod);
fclose(stdin);
fclose(stdout);
return 0;
}
求教大佬