1. 程式人生 > 其它 >CF小組訓練賽 Holiday 1

CF小組訓練賽 Holiday 1

技術標籤: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
    . The second lines contains one integer m (0 ≤ m ≤ 109) — Bob’s answer, possibly with 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是賊噁心的思維題

以後必補