本文主要是介绍2019 East Central North America(2021-07-22 12:00:00 至 2021-07-22 17:00:00 时长: 5小时 已有1026人报名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
比赛链接
A-Retribution!
关键词:模拟,排序;
思路:
由于 的规模很小,只有 ,因此只需求出所有裁判到每个仓库的路径长度并排序,根
据题意模拟即可。时间复杂度 。
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=1001;
typedef pair<double,double>pdd;
int n,m,p;
pdd nn[N];
pdd mm[N];
pdd pp[N];
struct node{int l;int r;double w;bool operator<(const node& t)const{if(fabs(this->w-t.w)<=1e-6){if(this->l==t.l)return this->r>t.r;else return this->l>t.l;}return this->w>t.w;}
};
double dist(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
int vis1[N+N];
int vis2[N+N];int main(){cin>>n>>m>>p;for(int i=1;i<=n;i++)cin>>nn[i].x>>nn[i].y;for(int i=1;i<=m;i++)cin>>mm[i].x>>mm[i].y;for(int i=1;i<=p;i++)cin>>pp[i].x>>pp[i].y;priority_queue<node,vector<node>,less<node>>q1;priority_queue<node,vector<node>,less<node>>q2;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)q1.push({i,j,dist(nn[i].x,nn[i].y,mm[j].x,mm[j].y)});for(int k=1;k<=p;k++)q2.push({i,k,dist(nn[i].x,nn[i].y,pp[k].x,pp[k].y)});}double ans1=0;while(!q1.empty()){auto t=q1.top();//cout<<"l r dist = "<<t.l<<" "<<t.r<<" "<<t.w<<endl;q1.pop();if(vis1[t.l]||vis1[t.r+N])continue;vis1[t.l]=1;vis1[t.r+N]=1;ans1+=t.w;//cout<<"ans1="<<ans1<<endl;}double ans2=0;while(!q2.empty()){auto t=q2.top();//cout<<"l r dist = "<<t.l<<" "<<t.r<<" "<<t.w<<endl;q2.pop();if(vis2[t.l]||vis2[t.r+N])continue;vis2[t.l]=1;vis2[t.r+N]=1;ans2+=t.w;//cout<<"ans2="<<ans2<<endl;}printf("%.10lf",ans1+ans2);
}
注意
less< node>是1 2 3 4 5升序,常用于求最短距离
greater< node>是5 4 3 2 1降序,常用于求最大权值
我之前在结构体运算符重写的时候犯了个错误
bool operator<(const node& t)const{if(fabs(this->w-t.w)<=1e-6){if(this->l==t.l)return this->r>t.r;else return this->l>t.l;}return this->w>t.w;}
bool operator<(const node& t)const{if(fabs(this->w-t.w)<=1e-6){if(this->l==t.l)return this->r<t.r;else return this->l<t.l;}return this->w<t.w;}
总结
用less的时候如果是要让这样排列
1 1 1
1 2 2
2 1 10
2 2 20
那么写结构体重载小于号<的时候就是this指针大于node &t,node& t小于this指针
B题是一个最短路问题,连接点这里
#include<bits/stdc++.h>
using namespace std;
const int N=2001;
typedef pair<int,int>pii;
pii dis[N];
int h[N],e[N],w[N],idx,ne[N],dist[N],l,r,vis[N],dian[N];
int n,m,T;
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}int st[N];
int st2[N];
int ans_dist=0x3f3f3f3f;
int ans_dian=0;
void dfs(int u,int cnt,int d){if(u==1&&cnt>=T)ans_dist=min(ans_dist,d);for(int i=h[u];~i;i=ne[i]){int j=e[i];if(!st[i]){st[i]=1;dfs(j,cnt+1,d+w[i]);st[i]=0;}}
}struct node{int d,id;};
void dj(){memset(dist,0x3f,sizeof dist);for(int i=1;i<=n;i++)dian[i]=1;dist[1]=0;priority_queue<node,vector<node> ,greater<node>>heap;heap.push({0,1});while(heap.size()){auto t=heap.top();heap.pop();int id=t.id;if(vis[id]==1)continue;vis[id]=1;for(int i=h[id];~i;i=ne[i]){int j=e[i];if(dist[j]>dist[id]+w[i]){dist[j]=dist[id]+w[i];dian[j]=dian[id]+1;}}}
}
int main(){cin>>n>>T>>l>>r;memset(h,-1,sizeof h);for(int i=1;i<=n;i++){cin>>m;while(m--){int id,d,cta;cin>>id>>d>>cta;if(cta<=l||360-cta<=r)add(i,id,d);}}dj();dfs(1,0,0);if(ans_dist<0x3f3f3f3f)cout<<ans_dist;else puts("impossible");
}
这是别人的ak代码,就是迪杰斯特拉的变相,设dist【u】【x】表示从起点1到u点时拖拉机头的朝向为x的距离,然后跑两遍dj
这题很难,我还是以后再慢慢消化吧
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef pair<LL,LL> pLL;
typedef pair<double,double> pdd;
const int N=1e3+5;
const int M=360;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
#define fi first
#define se second
#define ls (i<<1)
#define rs (i<<1|1)
#define mem(a,b) memset(a,b,sizeof(a))
#define print(a) printf("%lld\n",a)
#define eb emplace_back
#define pb push_back
#define mk make_pair
LL read()
{LL x=0,t=1;char ch=getchar();while(ch<'0'||ch>'9'){ if(ch=='-') t=-1; ch=getchar(); }while(ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); }return x*t;
}
int dis[N][M],vis[N][M],tur[N][N],n,d,a1,a2;
int check(int x,int y)
{return x-a2<=y&&y<=x+a1||y<=x+a1-360||y>=x-a2+360;
}
struct node{int x,disx,a;friend bool operator < (node A,node B){return A.disx>B.disx;}
};
vector<node> e[N];
priority_queue<node> q;
void dijk()
{mem(dis,0x3f);mem(vis,0);for(int i=0;i<360;i++) dis[1][i]=0,q.push(node{1,0,i});while(!q.empty()){node u=q.top();q.pop();if(vis[u.x][u.a]) continue;vis[u.x][u.a]=1;for(auto v:e[u.x]){if(!check(u.a,v.a)) continue;int k=(tur[u.x][v.x]+180)%360;if(dis[v.x][k]>dis[u.x][u.a]+v.disx){dis[v.x][k]=dis[u.x][u.a]+v.disx;q.push(node{v.x,dis[v.x][k],k});}}}for(int i=1;i<=n;i++)for(int j=0;j<360;j++){if(i!=d) dis[i][j]=inf;else if(dis[d][j]<inf) q.push(node{d,dis[d][j],j});vis[i][j]=0;}while(!q.empty()){node u=q.top();q.pop();//printf("%d %d %d\n",u.x,u.disx,u.a);if(vis[u.x][u.a]) continue;vis[u.x][u.a]=1;for(auto v:e[u.x]){if(!check(u.a,v.a)) continue;int k=(tur[u.x][v.x]+180)%360;if(dis[v.x][k]>dis[u.x][u.a]+v.disx){dis[v.x][k]=dis[u.x][u.a]+v.disx;q.push(node{v.x,dis[v.x][k],k});}}}
}
int main()//AC
{n=read(),d=read(),a1=read(),a2=read();for(int i=1;i<=n;i++){int m=read();while(m--){int x=read(),y=read(),z=read();e[i].pb(node{x,y,z});tur[x][i]=z;}}dijk();int ans=inf;for(int i=0;i<360;i++) ans=min(ans,dis[1][i]);if(ans<inf) printf("%d\n",ans);else printf("impossible\n");return 0;
}
c题就是一个线性规划问题,我用模拟退火做了三个钟做错了
c题传送门
#include<bits/stdc++.h>
using namespace std;
int n,m;
double zongliang[51],peibi[51][51],danjia[51];
int geshu[51];
int geshu2[51];
int max_geshu[51];
double ans=0;
double get_ans(){double res=0;for(int i=1;i<=m;i++)res+=geshu[i]*danjia[i];return res;
}
double zongliang2[51];
bool check(){memset(zongliang2,0,sizeof zongliang2);for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){zongliang2[j]+=geshu2[i]*peibi[i][j];if(zongliang2[j]>zongliang[j])return 0;}}return 1;
}
void sa(){for(double t=10000.0;t>1e-4;t*=0.993){do{for(int i=1;i<=m;i++)geshu2[i]=( (geshu[i] + (int(t)*rand() )%max_geshu[i])+max_geshu[i])%max_geshu[i];}while(!check());double now_ans=get_ans();for(int i=1;i<=m;i++)cout<<" geshu["<<i<<"]= "<<geshu[i]<<" ";if(now_ans>ans){ans=now_ans;for(int i=1;i<=m;i++)geshu[i]=geshu2[i];}else if(exp( (now_ans-ans)/t )>double(rand())/RAND_MAX ){for(int i=1;i<=m;i++)geshu[i]=geshu2[i];}cout<<"now_ans="<<now_ans<<" ans="<<ans<<endl;//for(int i=1;i<=m;i++)cout<<" geshu["<<i<<"]= "<<geshu[i]<<" ";}
}int main(){srand(time(0));cin>>n>>m;memset(max_geshu,0x3f,sizeof max_geshu);for(int i=1;i<=n;i++)cin>>zongliang[i];for(int j=1;j<=m;j++){for(int i=1;i<=n;i++){cin>>peibi[j][i];peibi[j][i]/=100.0;}cin>>danjia[j];for(int i=1;i<=n;i++)if(peibi[j][i]!=0)max_geshu[j]=min(max_geshu[j] , int(zongliang[i]/peibi[j][i])+1);}for(int i=1;i<=m;i++)cout<<"max_geshu="<<max_geshu[i]<<endl;sa();//cout<<ans;geshu[1]=200;geshu[2]=100;cout<<get_ans();
}
高级算法之单纯形法解决线性规划问题
它一定是
什么+什么+什么小于一个常数
然后使balabal最大化
在约束条件下,寻找目标函数z的最大值。
模板放这里
1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #include<cmath>6 using namespace std;7 typedef long long ll;8 const int M=10005,N=1005,INF=1e9;9 const double eps=1e-6;
10 inline int read(){
11 char c=getchar();int x=0,f=1;
12 while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
13 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
14 return x*f;
15 }
16
17 int n,m;
18 double a[M][N],b[M],c[N],v;
19 void pivot(int l,int e){
20 b[l]/=a[l][e];
21 for(int j=1;j<=n;j++) if(j!=e) a[l][j]/=a[l][e];
22 a[l][e]=1/a[l][e];
23
24 for(int i=1;i<=m;i++) if(i!=l&&fabs(a[i][e])>0){
25 b[i]-=a[i][e]*b[l];
26 for(int j=1;j<=n;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];
27 a[i][e]=-a[i][e]*a[l][e];
28 }
29
30 v+=c[e]*b[l];
31 for(int j=1;j<=n;j++) if(j!=e) c[j]-=c[e]*a[l][j];
32 c[e]=-c[e]*a[l][e];
33
34 //swap(B[l],N[e])
35 }
36
37 double simplex(){
38 while(true){
39 int e=0,l=0;
40 for(e=1;e<=n;e++) if(c[e]>eps) break;
41 if(e==n+1) return v;
42 double mn=INF;
43 for(int i=1;i<=m;i++)
44 if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;
45 if(mn==INF) return INF;//unbounded
46 pivot(l,e);
47 }
48 }
49
50 int main(){
51 n=read();m=read();
52 for(int i=1;i<=n;i++) c[i]=read();
53 for(int i=1;i<=m;i++){
54 int s=read(),t=read();
55 for(int j=s;j<=t;j++) a[i][j]=1;
56 b[i]=read();
57 }
58 printf("%d",(int)(simplex()+0.5));
59 }
#include<bits/stdc++.h>
using namespace std;
const in
t MAXN=1500;
const int MAXM=15000;
const double INF=1e10;
const double eps=1e-7;
typedef long long ll;int N,M;
double A[MAXM][MAXN];//A[i][j]表示第i个方程,Xj的系数是多少
double c[MAXN];//第i个方程需要<=的常数(c是系数
double b[MAXM];//目标方程Xj的系数是多少(b是约束
double v;void Pivot(int l,int e)
{b[l]/=A[l][e];for(int i=1;i<=M;i++)if(i!=e)A[l][i]/=A[l][e];A[l][e]=1/A[l][e];for(int i=1;i<=N;i++)if(i!=l && fabs(A[i][e])>eps){b[i]-=A[i][e]*b[l];for(int j=1;j<=M;j++)if(j!=e)A[i][j]-=A[i][e]*A[l][j];A[i][e]=-A[i][e]*A[l][e];}v+=c[e]*b[l];for(int i=1;i<=M;i++)if(i!=e)c[i]-=c[e]*A[l][i];c[e]=-c[e]*A[l][e];
}double Simplex()
{int i,l,e;while(true){for(i=1;i<=M;i++)if(c[i]>eps)break;if((e=i)==M+1)return v;//答案double tmp=INF;for(i=1;i<=N;i++)if(A[i][e]>eps && b[i]/A[i][e]<tmp)tmp=b[i]/A[i][e],l=i;if(tmp==INF)return INF;//无界Pivot(l,e);}
}
int main()
{scanf("%d%d",&N,&M);for(int i=1;i<=N;i++){scanf("%lf",&b[i]);b[i]*=100;}for(int i=1;i<=M;i++){for(int j=1;j<=N;j++){scanf("%lf",&A[j][i]);}scanf("%lf",&c[i]);}double ans=Simplex();printf("%.2lf\n",ans);return 0;
}
放几道单纯形法的例题
ZJOI2013防守阵线
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1005,M=1e4+5;
const double INF=1e15,eps=1e-8;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n,m;
double a[N][M];
int q[M];
void Pivot(int l,int e){double t=a[l][e];a[l][e]=1;for(int j=0;j<=n;j++) a[l][j]/=t;int p=0;for(int j=0;j<=n;j++) if(abs(a[l][j])>eps) q[++p]=j;for(int i=0;i<=m;i++) if(i!=l && abs(a[i][e])>eps){double t=a[i][e];a[i][e]=0;for(int j=1;j<=p;j++) a[i][q[j]]-=t*a[l][q[j]];}
}
void simplex(){while(true){int l=0,e=0; double mn=INF;for(int j=1;j<=n;j++) if(a[0][j]>eps) {e=j;break;}if(!e) return;for(int i=1;i<=m;i++) if(a[i][e]>eps && a[i][0]/a[i][e]<mn) {mn=a[i][0]/a[i][e];l=i;}if(!l) return;//unboundedPivot(l,e);}
}
int main(){freopen("in","r",stdin);n=read();m=read();swap(n,m);for(int i=1;i<=m;i++) a[i][0]=read();for(int j=1;j<=n;j++){int l=read(),r=read();for(int i=l;i<=r;i++) a[i][j]=1;a[0][j]=read();}simplex();printf("%d",int(-a[0][0]+0.5));
}
BZOJ1061志愿者招募
洛谷的传送门
acwing的传送门
#include<bits/stdc++.h>
using namespace std;
const int M=10001,N=1001,INF=1e9;
const double eps=1e-6;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
double a[M][N];//有m个变量n个方程
double b[M];//m个x系数也就是答案系数
double c[N];//n个约束
double v;//答案
void pivot(int l,int e){b[l]/=a[l][e];for(int j=1;j<=n;j++)if(j!=e)a[l][j]/=a[l][e];//这里的n是方程个数a[l][e]=1/a[l][e];for(int i=1;i<=m;i++)if(i!=l&&fabs(a[i][e])>0){b[i]-=a[i][e]*b[l];for(int j=1;j<=n;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];a[i][e]=-a[i][e]*a[l][e];}v+=c[e]*b[l];for(int j=1;j<=n;j++)if(j!=e)c[j]-=c[e]*a[l][j];c[e]=-c[e]*a[l][e];
}
double simplex(){while(true){int e=0,l=0;for(e=1;e<=n;e++) if(c[e]>eps) break;if(e==n+1) return v;double mn=INF;for(int i=1;i<=m;i++)if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;if(mn==INF) return INF;//unboundedpivot(l,e);}}
int main(){n=read();m=read();//n个方程,m个待求解的未知数for(int i=1;i<=n;i++)c[i]=read();for(int i=1;i<=m;i++){int l=read(),r=read();for(int j=l;j<=r;j++)a[i][j]=1;b[i]=read();}printf("%d",int(simplex()+0.5));
}
战线可以看作一个长度为 n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第 i 号位置上建一座塔有 Ci 的花费,且一个位置可以建任意多的塔,费用累加计算。
有 m 个区间 [L1,R1],[L2,R2],…,[Lm,Rm],在第 i 个区间的范围内要建至少 Di 座塔,求最少花费。
输入格式
第一行为两个数 n,m。
接下来一行,有 n 个数,描述 C 数组。
接下来 m 行,每行三个数 Li,Ri,Di,描述一个区间。
输出格式
仅包含一行,一个数,为最少花费。
数据范围
1≤n≤1000,
1≤m≤10000,
1≤Li≤Ri≤n,
其余数据均 ≤10000。
输入样例:
5 3
1 5 6 3 4
2 3 1
1 5 4
3 5 2
输出样例:
11
#include<bits/stdc++.h>
using namespace std;
const int M=10001,N=10001;
#define INF 1e10
const double eps=1e-6;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
double a[M][N];//有m个变量n个方程
double b[M];//m个x系数也就是答案系数
double c[N];//n个约束
double v;//答案
void pivot(int l,int e){b[l]/=a[l][e];for(int j=1;j<=n;j++)if(j!=e)a[l][j]/=a[l][e];//这里的n是方程个数a[l][e]=1/a[l][e];for(int i=1;i<=m;i++)if(i!=l&&fabs(a[i][e])>0){b[i]-=a[i][e]*b[l];for(int j=1;j<=n;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];a[i][e]=-a[i][e]*a[l][e];}v+=c[e]*b[l];for(int j=1;j<=n;j++)if(j!=e)c[j]-=c[e]*a[l][j];c[e]=-c[e]*a[l][e];
}
double simplex(){while(true){int e=0,l=0;for(e=1;e<=n;e++) if(c[e]>eps) break;if(e==n+1) return v;double mn=INF;for(int i=1;i<=m;i++)if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;if(mn==INF) return INF;//unboundedpivot(l,e);}}
signed main(){n=read();m=read();swap(n,m);//n个方程,m个待求解的未知数//5个答案系数,3个方程for(int i=1;i<=m;i++)b[i]=read();// for(int i=1;i<=m;i++)cout<<b[i]<<" ";// cout<<endl;for(int i=1;i<=n;i++){int l=read(),r=read();for(int j=l;j<=r;j++)a[j][i]=1;c[i]=read();}printf("%d",(long long)(simplex()+0.5));
}
序列------一道很难想出来的线性规划问题
序列题解
E题
是一个动态规划问题
f【i】【j】【k】表示坐标为(i,j)得分为k
哪些能走到这个状态呢?
f【i-1】【j-1】【k-w[i][j]】往右下方走就走到了那个位置
f【i】【j-1】【k-w[i][j]】往正右方走
f【i+1】【j-1】【k-w[i][j]】往右上方走
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,k;
int f[511][511][11];
int a[511][511],w[511][511];
int ans;
int xx[]={1,0,-1,0};
int yy[]={0,1,0,-1};
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m>>k;memset(a,-1,sizeof a);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>a[i][j];}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]==-1)continue;int flag=1;for(int t=0;t<4;t++){int tx=i+xx[t];int ty=j+yy[t];if(a[tx][ty]==-1)flag=0;}if(flag&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1]&&a[i][j]<a[i-1][j]&&a[i][j]<a[i+1][j])w[i][j]=1;}}memset(f,0x3f,sizeof f);for(int i=1;i<=n;i++)f[i][0][0]=0;for(int j=1;j<=m;j++)for(int i=1;i<=n;i++)for(int x=k;x>=w[i][j];x--){if(a[i][j]==-1)continue;int &t=f[i][j][x];if(a[i-1][j-1]!=-1||j==1)t=min(t , f[i-1][j-1][x-w[i][j]]+a[i][j]);if(a[i][j-1]!=-1||j==1)t=min(t , f[i][j-1][x-w[i][j]]+a[i][j]);if(a[i+1][j-1]!=-1||j==1)t=min(t , f[i+1][j-1][x-w[i][j]]+a[i][j]);}int ans=INF;for(int i=1;i<=n;i++)ans=min(ans,f[i][m][k]);if(ans==INF)puts("impossible");else cout<<ans;}
如何用递归实现约瑟夫环
适用于n比较小的情况
假设编号从1开始
这个f函数返回的是n个人喊到m就死最后存活下来的人的编号
int f(int n,int m){if(n==1)return 1;return (f(n-1,m)+m-1)%n+1;
}
假设编号从0开始
这个f函数返回的是n个人喊到m就死最后存活下来的人的编号int f2(int n,int m){if(n==1)return 0;return (f2(n-1,m)+m)%n;
}
int ysfdg ( int sum, int value, int n)
{if ( n == 1 )return ( sum + value - 1 ) %sum;elsereturn ( ysfdg ( sum-1, value,n-1 ) +value ) %sum;
}
某公司招聘,有 n 个人入围,HR在黑板上依次写下 m 个正整数 A1,A2,…Am,然后这 n 个人围成一个圈,并按照顺时针顺序为他们编号 0,1,2,…n−1。
录取规则是:
第一轮从 0 号的人开始,取用黑板上的第 1 个数字,也就是 A1。
黑板上的数字按次序循环使用,即如果某轮用了第 k 个,如果 k<m,则下一轮需要用第 k+1 个;如果 k=m,则下一轮用第 1 个。
每一轮按照黑板上的次序取用到一个数字 Ax,淘汰掉从当前轮到的人开始按照顺时针顺序数到的第 Ax 个人。
下一轮开始时轮到的人即为被淘汰掉的人的顺时针顺序下一个人,被淘汰的人直接回家,所以不会被后续轮次计数时数到。
经过 n−1 轮后,剩下的最后 1 人被录取,所以最后被录取的人的编号与 (n,m,A1,A2,…Am) 相关。
输入格式
输入包含多组测试数据。
第一行包含整数 T,表示共有 T 组测试数据。
接下来 T 行,每行包含若干个整数,依次存放 n,m,A1,A2,…Am,表示一组数据。
输出格式
输出共 T 行,每行对应相应的那组数据确定的录取之人的编号。
cnt = int(input())
while cnt:cnt -= 1line = list(map(int, input().split()))n, m, arr = line[0], line[1], line[2:] res = 0for i in range(2, n + 1):res = (res + arr[(n - i) % m]) % iprint(res)
牛客的那一场比赛链接在这里
题解pdf在q群不过我也不想看了,到时候哪道题不会直接去csdn上搜吧
这篇关于2019 East Central North America(2021-07-22 12:00:00 至 2021-07-22 17:00:00 时长: 5小时 已有1026人报名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!