0
已解决
薛乘志
初级启示者
初级启示者
4255 游历列国经验值:1200
题目描述 Description
有一个僧侣想依次游历n个国家,现在已知从第i个国家到第i+1个国家之前,僧侣能募集到gi元钱,从第i个国家到第i+1个国家要花费ci元钱。现在可以从任意一个国家出发,试判断僧侣能否依次将n个国家环游一遍,如果不可以输出-1;可以的话输出可以开始的国家中编号最小的一个。
输入描述 Input Description
第一行,一个正整数,n
第二行,n个正整数,g1 g2 … gn
第三行,n个正整数,c1 c2 … cn
输出描述 Output Description
如果可以游历一遍的话,输出可以开始的国家中编号最小的一个,否则输出-1
样例输入 Sample Input
【样例输入1】 5 1 2 3 4 5 3 4 5 1 2 【样例输入2】 3 2 3 4 3 4 3
样例输出 Sample Output
【样例输出1】 4 【样例输出2】 -1
数据范围及提示 Data Size & Hint
n<=50
请思考如何在o(n)的时间内求出答案
错误的代码:60分
int a[101],b[101],n;
bool can(int st){
bool x[101]={};
int sum=0;
x[st]=1;
sum+=a[st];
sum-=b[st];
if(sum<0){
return false;
}
for(int j=0;j<n;j++){
int xh=-1,minn=1000;
for(int i=0;i<n;i++){
if(abs(b[i]-(sum+a[i]))<=minn&&x[i]==0&&(sum+a[i])>=b[i]){
minn=abs(a[i]-(sum+a[i]));
xh=i;
}
}
if(xh==-1){
continue;
}
sum+=a[xh];
sum-=b[xh];
x[xh]=1;
}
for(int i=0;i<n;i++){
if(x[i]==0){
return false;
}
}
return true;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i];
}
int minn=-1;
for(int i=0;i<n;i++){
if(can(i)){
cout<<i+1<<" ";
return 0;
}
}
cout<<-1;
//fclose(stdin);
//fclose(stdout);
return 0;
}
错误信息:
Wrong Answer:60分
1
Accepted
0ms
2
Accepted
0ms
3
Accepted
0ms
4
Accepted
0ms
5
Wrong Answer
0ms
6
Wrong Answer
0ms
7
Accepted
0ms
8
Wrong Answer
0ms
9
Accepted
0ms
10
Wrong Answer
0ms
求分析哪里错了
薛乘志在2022-11-12 13:12:55追加了内容
薛乘志在2022-11-12 13:13:43追加了内容
薛乘志在2022-11-12 13:18:01追加了内容