A
link
把最後三位取成數字,判斷是否小於\(349\),大於\(1\),不等於\(316\)。
點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
char s[10];
int ans;
signed main(){
cin >> s+1;
ans += s[4]-48;
ans *= 10;
ans += s[5]-48;
ans *= 10;
ans += s[6]-48;
if(ans >= 1&&ans <= 349
&&ans != 316) cout << "Yes";
else cout << "No";
return 0;
}
B
link
用一個陣列存每個牙是不是還在,模擬即可。
點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int n,q;
int ans;
int a[1005];
signed main(){
cin >> n >> q;
while(q--){
int x;
cin >> x;
if(a[x]) a[x] = 0,ans--;
else a[x] = 1,ans++;
}
cout << n-ans;
return 0;
}
C
link
由於沒有要求最小次數,第\(i\)次只需要把\(i\)這個數字換到\(i\)這個位置,用一個陣列存\(i\)這個數字當前在哪個位置。
點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int n;
int a[200005];
int ans;
int l[200005],r[200005];
int mp[200005];
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i)
cin >> a[i],mp[a[i]] = i;
for(int i = 1;i <= n;++ i){
if(a[i] != i){
ans++;
int t = mp[i];
swap(mp[a[i]],mp[i]);
swap(a[i],a[t]);
l[ans] = i,r[ans] = t;
}
}
cout << ans << endl;
for(int i = 1;i <= ans;++ i)
cout << l[i] << " " << r[i] << endl;
return 0;
}