solved 3
A(签到)
题意:
签到
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define pb push_back #define mp make_pair #define LL long long #define nd second #define st first #define pii pair<int , int> const int N = 2e2+7; int n; pii a[N]; int main(){ cin>>n; rep(i,n){ int l,r; cin>>l>>r; a[i]=mp(l,r); } int x; cin>>x; rep(i,n){ if(a[i].nd>=x){ cout<<n-i+1; return 0; } } }
B(思维)
题意:
有线性排列的n个洞,开始时每个洞口有一块石头,每个洞口里有一个金币,当洞口没有石头时可以取出金币,开始时在第k个洞口。
1取出金币 2把当前洞口的一块石头扔到其他任意一个洞口 3移动一步 都视为一次操作。
求取出所有金币最少的操作数。
显然取完第一个洞口之后,所有的石头就可以扔到第一个洞口上,因此只需要移n+1块石头,取金币要n次操作,移动只需要遍历一遍所有洞口,根据初始位置可以直接算出。
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define pb push_back #define mp make_pair #define LL long long #define nd second #define st first #define pii pair<int , int> const int N = 2e2+7; int n,k; int main(){ cin>>n>>k; int ans=n*2+1; ans+=min(n-1+k-1,n-k+n-1) ; cout<<ans; }
C(思维)
题意:
给出矩阵A,B,可以无限次地转置任意一个A的子方阵,问A是否可以变换为B。
观察知方阵的转置等价于若干次交换副对角线上相邻的两个数,即左下和右上交换,也就是每条副对角线上的元素都是可以任意交换的,因此只需要判断A和B的每一条副对角线上是否含有完全相同的数即可。
#include<bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define pb push_back #define mp make_pair #define LL long long #define nd second #define st first #define pii pair<int , int> const int N = 2e4+7; vector<int> a[N]; vector<int> b[N]; int main(){ int n,m; cin>>n>>m; rep(i,n) rep(j,m){ int x; cin>>x; a[i+j].pb(x); } rep(i,n) rep(j,m){ int x; cin>>x; b[i+j].pb(x); } for(int i=2;i<=n+m;i++){ sort(a[i].begin(),a[i].end()); sort(b[i].begin(),b[i].end()); for(int j=0;j<a[i].size();j++)if(a[i][j]!=b[i][j]){ cout<<"NO"; return 0; } } cout<<"YES"; }