A 棋子
由贪心可知,能合成则合成,之后再结构体排序一下就可以了。
#include<bits/stdc++.h>
using namespace std;
#define int long long//别忘了这个
int n;
struct player{
int v;
int i;
}a[100007];
bool cmp(player &a,player &b){
if(a.v!=b.v)return a.v>b.v;
return a.i<b.i;
}
signed main( )
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
int z,y,x;
cin>>z>>y>>x;
y+=z/3;
z%=3;
x+=y/3;
y%=3;
a[i].i=i;
a[i].v=18*x+3*y+z;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)cout<<a[i].i<<' ';
cout<<'\n';
return 0;
}
B 大海
因为每次只能往前走或者右拐(在同一个格子里不能多次右拐),那么走的路线是可能是“口”字型的,如果直接暴力枚举时间复杂度会到 $ O(n^4) $,无法通过。我们可以使用二位前缀和预处理出每个格子到(1,1)这段矩形区域的值总和,再枚举就可以了。
#include<bits/stdc++.h>
using namespace std;
int g[1007][1007],n;
int main( )
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>g[i][j],g[i][j]=g[i][j]+g[i-1][j]+g[i][j-1]-g[i-1][j-1];
int maxx=-1e9;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
maxx=max(maxx,g[i][j]-g[i-1][j-1]+g[i-1][1]+g[1][j-1]-g[1][1]);
}
}
cout<<maxx+100<<'\n';
return 0;
}
C 同构
因为数组长度为N且每个数在1到N之间且每个数都不相同,那么这两个数组一定是长度为N的排列。对于1~N的每个数,我们用数组 $a$ 存它在两个数组中的下标的差值。为满足条件,最后的数组 $a$ 只会存在 $ -k,k $ 或者0这样的数。例如 $[-2,-2,-2,0,0,2,2,2]$ 和 $[0,0,0,0,0]$ 是满足的,而 $[-2,-2,-2,0,0,1,2,2]$ 是不满足的。
#include<bits/stdc++.h>
using namespace std;
int n,a[1000007];
void solve(){
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]=i;
}
for(int i=0;i<n;i++){
int x;
cin>>x;
a[x]-=i;
}
int vis=0;
for(int i=1;i<=n;i++){
if(a[i]==0)continue;
if(vis==0)vis=abs(a[i]);
else if(vis!=abs(a[i])){
cout<<"No\n";
return;
}
}
cout<<"Yes\n";
}
int main( )
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int q;
cin>>q;
while(q--)solve();
return 0;
}
D 网络ip
STL中map的运用
#include<bits/stdc++.h>
using namespace std;
map<string,string>mp;
int n;
int main( )
{
cin>>n;
for(int i=0;i<n;i++){
string a,b;
cin>>a>>b;
mp[b]=a;
}
int q;
cin>>q;
while(q--){
string s;
cin>>s;
cout<<mp[s]<<'\n';
}
return 0;
}
浙公网安备 33010602011771号