第一题:可将矩阵看成一维数组a[N*N],进行简单运算即可。(一维转二维公式)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,t;
cin>>n>>t;
t%=(n*n);
int a=t/n+1,b=t%n+1;
cout<<a<<' '<<b;
return 0;
}
第二题:运用结构体,w:所含灵石数量;h:传送所需灵石数量;ca:差。 对h从小到大进行排序,接着i从1到n循环,如果碰到传送所需灵石>此刻现有灵石数量,直接跳出;如果差<0,则视为不利,continue。 最后输出现有灵石数量即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
struct Node{
int w,h,ca;
}a[N];
bool cmp(Node x,Node y)
{
return x.h<y.h;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&a[i].w,&a[i].h);
a[i].ca=a[i].w-a[i].h;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i)
{
if(a[i].h>m) break;
if(a[i].ca<=0) continue;
m+=a[i].ca;
}
printf("%d",m);
return 0;
}
第三题:找!规!律! 可发现输出仅有2种:0、1。 若数组和第一次跳跃后排列相同,则直接输出0。 此刻我们会下意识用cnt计数,可尝试几个样例后发现,除0、1之外无他数,可判断如果第一次有不相同的,必定是1,直接return 0。循环结束则表明全部相同,输出0即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int a[N],b[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",a+i);
b[i]=a[i];
}
bool done=true;
for(int i=1;i<=n;++i)
{
for(int j=n;j>=i;--j)
{
if(a[j]>=a[i])
{
if(a[j]!=b[i])
{
puts("1");
return 0;
}
b[i]=a[j];
break;
}
}
}
puts("0");
return 0;
}
第四题 一个背包(和采药类似),一个类似区间dp 有点像CSP2019 纪念品
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e4+7,M=207;
LL n,m,T,w[N],f[N][37],a[N];
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(int i=1,k;i<=n;++i)
{
scanf("%d",&k);
memset(w,0,sizeof w);
for(int j=1,v,t;j<=k;++j){
scanf("%d%d",&v,&t);
for(int u=T;u>=t;--u)
w[u]=max(w[u],w[u-t]+v);
}
f[i][1]=a[i]=w[T];
}
for(int j=2;j<=m;++j)
for(int i=1;i+j-1<=n;++i)
f[i][j]=max((f[i][j-1]<<1)+a[i+j-1],(f[i+1][j-1]<<1)+a[i]);
LL ans=0;
for(int i=1;i+m-1<=n;++i) ans=max(ans,f[i][m]);
cout<<ans;
return 0;
}
总结:这一次不算太难,特别第三题,得分很容易。没有出现图论和最小生成树问题。 Goodbye!