[cf]Codeforces Round #546 (Div. 2)
阿新 • • 發佈:2019-03-12
display close long long style none -i for 石頭 ack
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];View Codeint 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++) #defineView Codepb 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"; }View Code
[cf]Codeforces Round #546 (Div. 2)