USACOトピックソリューション

ソース:

セクション1.2

セクション1.3

1.キューブ変換

アイデア:この問題の7つの状況では、元の画像をs1に保存し、ターゲットをs2に保存してから、次のようにメソッドをトラバースします。

1:最初の列がnから1に変わり、列が1からnに変わります
2:最初の列nから1に変わり、行がnから1に変わります
3:最初の列が1からnに変わり、行がnから1に変更
4:最初に列がnから1に変更され、行が1からnに変更されます
。5:最初に各行の順序を逆にしてから、1または2または3を実行します
。6:s1とs2を比較します。それらが等しいかどうか
7:上記のいずれも満たされない場合
は、トラバーサルの結果を保存します。s3を入力し、使用するたびにクリアして、等しいかどうかを比較します(もちろん、6、7については判断しないでください)。

コード

#include <bits/stdc++.h>
using namespace std;
int n,i,j;
char a[11][11],b[11][11];
string s1,s2,s3="";
int main(){
    
    
	ios::sync_with_stdio(false);
	cin>>n;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++){
    
    
			cin>>a[i][j];
			s1+=a[i][j];	
		}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++){
    
    
			cin>>b[i][j];
			s2+=b[i][j];	
		}
	for(i=1;i<=n;i++)
		for(j=n;j>=1;j--)s3+=a[j][i];
	if(s3==s2){
    
    
		cout<<1;
		return 0;	
	}
	s3="";
	for(i=n;i>=1;i--)
		for(j=n;j>=1;j--)s3+=a[i][j];
	if(s3==s2){
    
    
		cout<<2;
		return 0;	
	}
	s3="";
	for(i=n;i>=1;i--)
		for(j=1;j<=n;j++)s3+=a[j][i];
	if(s3==s2){
    
    
		cout<<3;
		return 0;	
	}
	s3="";
	for(i=1;i<=n;i++)
		for(j=n;j>=1;j--)s3+=a[i][j];
	if(s3==s2){
    
    
		cout<<4;
		return 0;
	}
	s3="";
	for(i=1;i<=n;i++)
		for(j=1;j<=n/2;j++)swap(a[i][j],a[i][n-j+1]);
	for(i=1;i<=n;i++)
		for(j=n;j>=1;j--)s3+=a[j][i];
	if(s3==s2){
    
    
		cout<<5;
		return 0;	
	}
	s3="";
	for(i=n;i>=1;i--)
		for(j=n;j>=1;j--)s3+=a[i][j];
	if(s3==s2){
    
    
		cout<<5;
		return 0;	
	}
	s3="";
	for(i=n;i>=1;i--)
		for(j=1;j<=n;j++)s3+=a[j][i];
	if(s3==s2){
    
    
		cout<<5;
		return 0;	
	}
	if(s1==s2)cout<<6;
	else cout<<7;
}
    

2.その番号に名前を付けます*

アイデア:電話のキーをシミュレートできるようにchar配列を作成し、mapを使用して番号が表示されるかどうかを保存し、詳細検索を実行して、辞書に名前がある場合は名前を出力し、マークしてからマーク0の場合は「NOME」を出力します。
コード

#include <bits/stdc++.h>
using namespace std;
string a,x,s;
char ch[100][100]={
    
    "ABC","DEF","GHI","JKL","MNO","PRS","TUV","WXY"};
int l;
map<string,int>mp;
bool f;
void work(int deep){
    
    
    if(deep==l){
    
    
    	if(mp[s]==true){
    
    
    		for(int i=0;i<=l-1;i++)cout<<s[i];
    		cout<<endl;
			f=1;
		}
		return;
	}
	string t = s;
    for(int i=1;i<=3;i++){
    
    
    	s += ch[a[deep]-'0'-2][i-1];
    	work(deep+1);
    	s=t;
	}
	return;
}
int main() {
    
    
    ios::sync_with_stdio(false);
    cin>>a;
    l=a.size();
    for(int i=1;i<=4617;i++){
    
    
    	cin>>x;
    	mp[x]=true;
	}
    work(0);
    if(!f)cout<<"NONE";
}

3.回文平方数

アイデア:[1,300]を列挙し、元の数のbベースとbの2乗を表す2つの配列を作成します。関数に毎回配列を変更させます。2乗が回文の場合は、のbベースを計算します。元の数値出力(b> 10が表示された場合、出力が> = 10であるかどうかが判断され、大文字に変換されます)。少し
コーディングする

4.二重回文の数

アイデア:直接循環列挙システムを作成し、各桁を計算して回文数が> = 2であるかどうかを判断し、それを出力します。少し
コーディングする

5.ミルクを混ぜます

アイデア:構造を直接構築し、単価を並べ替えてから、nの最小値と最大量に対応する単価を取得します(この種の牛乳は供給量が非常に多いため、お金を節約するために指定された数量)、2つの最小値を差し引いた後、単価*数量をsに加算し、最後に出力します。

6.ブルペンを修理します

アイデア:牛の位置を並べ替えてから、牛を一連のセグメントのようにいくつかのセグメントに分割し(つまり、連続した牛は1つのセグメントとしてカウントされます)、隣接する2つのセグメントごとの距離を計算し、並べ替えてから、前面を置く(分割したセグメントの数(つまり、ボードの数)-ターゲットボードの数)が追加されます(<= 0の場合は追加しないでください)。

7.スキーコースのデザイン

アイデア:最低の高さ(0〜87)を列挙すると、最高の高さは最低の高さ+17になる可能性があるため、高さが最低の高さよりも高い場合は、それを低くする必要があります。最も低い高さ、それを増やします。
コード

#include<bits/stdc++.h>
using namespace std;
int n,a[10001],s,minn=INT_MAX,i,j;
int main(){
    
    
	cin>>n;
	for(i=1;i<=n;i++)cin>>a[i];
	for(i=0;i<=83;i++){
    
    
		s=0;
		for(j=1;j<=n;j++){
    
    
			if(a[j]<i)s+=(i-a[j])*(i-a[j]);
			if(a[j]>i+17)s+=(a[j]-i-17)*(a[j]-i-17);
		}
		minn=min(s,minn);
	}
	cout<<minn;
}

おすすめ

転載: blog.csdn.net/weixin_52536621/article/details/113571697