CF小組訓練賽 Holiday 1
阿新 • • 發佈:2021-02-03
技術標籤:codeforces
A. Super Agent
具體題目地址可以直接搜尋題目標題
題目大意
判定一個字元矩陣是否中心對稱
解題思路
水題。
#include<bits/stdc++.h>
using namespace std;
char a[5][5];
int main(){
for(int i = 0; i < 3;i++){
for(int j = 0;j < 3;j++){
scanf("%c",&a[i][j]);
}
getchar();
}
int f = 1;
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
if(a[i][j] != a[2 - i][2 - j]){
f = 0;
break;
}
}
}
if(f) puts("YES");
else puts("NO");
return 0;
}
B. Correct Solution?
具體題目地址可以直接搜尋題目標題
題目大意
將數字n中的每一位數字重新排序,以獲得不帶前導零的最小可能數字,給定n與玩家猜的m,判定m是否是正確答案
解題思路
題目有巨坑。
- The first line contains one integer n (0 ≤ n ≤ 109) without leading zeroes
所以,就有可能存在以下情況:
n=0,m=0; OK
n=0,m=00; WA
n=123456,m=0123456; WA
會卡這個前導0,非常噁心。
思路1 模擬
- 程式碼相當繁瑣,想要1try過,必須考慮很周全
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
int get(int n){
int m = n;
int all = 0;
int zero = 0;
vector<int> v;
while(m != 0){
int t = m % 10;
m /= 10;
if(t != 0){
v.pb(t);
}else{
zero++;
}
all++;
}
sort(v.begin(),v.end());
int k = pow(10,all - 1);
int re = 0;
re += v[0] * k;
k /= 10;
while(zero != 0){
k /= 10;
zero--;
}
for(int i = 1;i < v.size();i++){
re += v[i] * k;
k /= 10;
}
return re;
}
int check(string s){
int f = 1;
if(s[0] == '0'){
for(int i = 0;i < s.length();i++){
if(s[i] != '0'){
f = 0;
break;
}
}
if(f == 1){
if(s.length() > 1){
return -1;
}else{
return 0;
}
}else{
return -1;
}
}
int k = pow(10,s.length()-1);
int r = 0;
for(int i = 0;i < s.length();i++){
r += (s[i] - '0') * k;
k /= 10;
}
return r;
}
int main(){
int n,m;
cin >> n;
string s;
cin >> s;
m = check(s);
if(m == -1){
puts("WRONG_ANSWER");
}else if(n == 0){
if(m == 0){
puts("OK");
}else{
puts("WRONG_ANSWER");
}
}else{
int x = get(n);
//cout << x << endl;
if(x != m) puts("WRONG_ANSWER");
else puts("OK");
}
return 0;
}
思路2 直接按照字串處理
#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
//freopen("x.txt","r",stdin);
string a;
string b;
cin >> a;
cin >> b;
string res = "";
sort(a.begin(),a.end());
int len = a.length();
int j = 0;
for(int i = 0; i < len;i++){
if(a[i] != '0'){
res += a[i];
j++;
}
}
int x = len - j;
string en = "";
en += res[0];
for(int p = 0;p < x;p++)
en += "0";
int ll = res.length();
for(int p = 1;p < ll;p++)
en += res[p];
if(a == "0" && b == "0"){
printf("OK\n");
}else{
if(en == b){
printf("OK\n");
}else{
printf("WRONG_ANSWER\n");
}
}
return 0;
}
C. Fruits
具體題目地址可以直接搜尋題目標題
題目大意
A去買水果,但每個水果的價格標籤還沒有貼上去,問最好情況和最壞情況下,各需要多少錢
解題思路
水題。分兩種情況,簡單排序就可。
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main(){
int n,m;
cin >> n >> m;
string s;
map<string,int> M;
for(int i = 0; i< n;i++) scanf("%d",&a[i]);
sort(a,a+n);
for(int i = 0;i < m;i++){
cin >> s;
if(M.count(s) == -1){
M[s] = 1;
}else{
M[s]++;
}
}
vector<int> v;
for(map<string,int>::iterator it = M.begin();it != M.end();it++){
//cout << it->first << " " << it->second << endl;
v.push_back(it->second);
}
int good = 0;
sort(v.begin(),v.end(),greater<int>() );
int j = 0;
for(int i = 0; i < v.size();i++){
good += v[i] * a[j];
j++;
}
int bad = 0;
sort(a,a+n,greater<int>());
j = 0;
for(int i = 0;i < v.size();i++){
bad += a[j] * v[i];
j++;
}
cout << good << " " << bad << endl;
return 0;
}
剩下的題:
D是樹狀陣列三維排序
E是賊噁心的思維題