https://ac.nowcoder.com/acm/contest/67742/D
可以将卡的不同顺序当成图上的点,使用卡的不同情况看成连接点的路径,由于n范围不大,n^2也没问题,所以可以直接广搜,把卡的初始位置当作起点,卡组牌堆顶上看作终点,进行广搜就行了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
long long n,m,k,a[1111],b[1111];
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;i++) scanf("%lld%lld",&a[i],&b[i]);
long long cmm[5555],head=1,tail=1,line[555555];
for(int i=1;i<=n;i++) cmm[i]=-1;
cmm[k]=0;
line[tail]=k;
tail++;
while(head!=tail){
int now=line[head];
for(int i=1;i<=m;i++){
if(cmm[(now+a[i]-1)%n+1]==-1 || cmm[(now+a[i]-1)%n+1]>cmm[now]+b[i]){
cmm[(now+a[i]-1)%n+1]=cmm[now]+b[i];
if((now+a[i]-1)%n+1!=n){
line[tail]=(now+a[i]-1)%n+1;
tail++;
if(tail>55555) tail=1;
}
}
}
head++;
if(head>55555) head=1;
}
printf("%lld\n",cmm[n]);
}
return 0;
}