SDUT-2017年冬休み合宿段階テスト試合3(チーム編成)--解題報告
21008 ワード
試合ID:2015
注:本題解参照コードはC++コードです.C使用者の場合、認識していないヘッダファイルが発生した場合、
A - SDUT 2413 n a^o7 !
問題にサインする.文字列を逆順に繰り返し、対応するルールに従って出力すればよい.
参照コード:
B-SDUT 2777 Pちゃんの話-不思議な両替
典型的な完全なリュックサックは案数の問題を満たして、私達は3種類の物品があると見なすことができて、重量はそれぞれ1、2、3で、リュックサックの容量はお金の数Nで、リュックサックの案数を満たしてこの問題の答えです.
具体的なアルゴリズムはこのブログを学ぶことをお勧めします:“01リュックサック”と“完全リュックサック”がリュックサックをいっぱい入れる方案の総数の分析と実現.
参照コード:
C-SDUT 1576マジック47
直接lからrまで遍歴し,残数が47であるか否かを判断し,負数型取りの場合に注意する.
参照コード:
D-SDUT 1025ボードの問題
DFSを利用して,遡及タグ行列が使用されたかどうか,kまでの数で答えを記録することができる.
参照コード:
E - SDUT 3253 Game!
簡単なゲームでは、後手は先手の鏡像について石を取るだけでいい.
先手が取った後に奇数個残っていれば、後手は対称位置の1つの石を取り、そうでなければ後手は対称位置の2つの石を取り、いつも先手を必ず負けさせることができる.
n<=2先手が一度に取れるときだけ先手が勝つ.
参照コード:
F-SDUT 2930人が生きているシリーズの会議
マルチソース最短問題.島ごとのアルファベット番号を数字にマッピングすれば、通常の最短ルートと同じように処理できます.重辺がある可能性があることに注意してください.
参照コード:
G-SDUT 2778小明の費用予算
このブログを参考にしてください.
H - SDUT 2162 The Android University ACM Team Selection Contest
やや複雑なシミュレーション問題は、問題の意味に応じてシミュレーションすればいい.
参照コード:
注:本題解参照コードはC++コードです.C使用者の場合、認識していないヘッダファイルが発生した場合、
c
で始まる場合は、冒頭のc
を削除し、末尾に.h
を追加することで、Cのヘッダファイルに変換できます.例えば、cstdio
はCでstdio.h
で、その他は自分で検索してください.また、sort( )
、stack( )
など、知らない書き方があれば、ご自分で実現してください.A - SDUT 2413 n a^o7 !
問題にサインする.文字列を逆順に繰り返し、対応するルールに従って出力すればよい.
参照コード:
#include
#include
using namespace std;
int main(int argc, char const *argv[]) {
int t;
char str[101];
scanf("%d%*c", &t);
for(int l=1; l<=t; ++l) {
gets(str);
printf("Case %d: ", l);
for(int i=strlen(str)-1; i>=0; --i) {
if(str[i] == '!') putchar('i');
else if(str[i] == 'u') putchar('n');
else if(str[i] == 'n') putchar('u');
else if(str[i] == 'a') putchar('e');
else if(str[i] == 'e') putchar('a');
else if(str[i] == 'p') putchar('d');
else if(str[i] == '7') putchar('l');
else if(str[i] == '^') putchar('v');
else if(str[i] == 'w') putchar('m');
else if(str[i] == '5') putchar('s');
else putchar(str[i]);
}
putchar('
');
}
return 0;
}
B-SDUT 2777 Pちゃんの話-不思議な両替
典型的な完全なリュックサックは案数の問題を満たして、私達は3種類の物品があると見なすことができて、重量はそれぞれ1、2、3で、リュックサックの容量はお金の数Nで、リュックサックの案数を満たしてこの問題の答えです.
具体的なアルゴリズムはこのブログを学ぶことをお勧めします:“01リュックサック”と“完全リュックサック”がリュックサックをいっぱい入れる方案の総数の分析と実現.
参照コード:
#include
using namespace std;
const int MAXC = 32767;
const int MAXN = 3;
int main(int argc, char const *argv[]) {
int n, w[MAXN+1] = {0, 1, 2, 3,}, dp[MAXC+1] = {0};
dp[0] = 1;
for(int i=1; i<=MAXN; ++i) {
for(int j=w[i]; j<=MAXC; ++j) {
dp[j] += dp[j-w[i]];
}
}
while(~ scanf("%d", &n)) {
printf("%d
", dp[n]);
}
return 0;
}
C-SDUT 1576マジック47
直接lからrまで遍歴し,残数が47であるか否かを判断し,負数型取りの場合に注意する.
参照コード:
#include
#include
#include
using namespace std;
int main(int argc, char const *argv[]) {
int n, l, r;
scanf("%d", &n);
while(n--){
scanf("%d %d", &l, &r);
if(l > r) swap(l, r);
bool has = false;
for(int i=l; i<=r; ++i) {
if(abs(i%100) == 47) {
printf("%d
", i);
has = true;
}
}
if(!has) printf("NONE
");
}
return 0;
}
D-SDUT 1025ボードの問題
DFSを利用して,遡及タグ行列が使用されたかどうか,kまでの数で答えを記録することができる.
参照コード:
#include
#include
using namespace std;
int n, k, ans;
char graph[8][9];
bool vis_r[8], vis_c[8];
void DFS(int r, int num) {
if(num == k) { // k,
ans++;
return;
}
for(int i=r; i//
for(int j=0; j//
if(graph[i][j]=='#' && !vis_r[i] && !vis_c[j]) { //
vis_r[i] = vis_c[j] = true; //
DFS(i, num+1);
vis_r[i] = vis_c[j] = false; //
}
}
}
}
int main(int argc, char const *argv[]) {
while(scanf("%d %d", &n, &k), ~n|~k) {
memset(vis_r, false, sizeof(vis_r));
memset(vis_c, false, sizeof(vis_c));
for(int i=0; iscanf("%s", graph[i]);
}
ans = 0;
DFS(0, 0);
printf("%d
", ans);
}
return 0;
}
E - SDUT 3253 Game!
簡単なゲームでは、後手は先手の鏡像について石を取るだけでいい.
先手が取った後に奇数個残っていれば、後手は対称位置の1つの石を取り、そうでなければ後手は対称位置の2つの石を取り、いつも先手を必ず負けさせることができる.
n<=2先手が一度に取れるときだけ先手が勝つ.
参照コード:
#include
using namespace std;
int main(int argc, char const *argv[]) {
int t;
long long n;
scanf("%d", &t);
while(t--){
scanf("%lld", &n);
if(n > 2) printf("blankcqk
");
else printf("zbybr
");
}
return 0;
}
F-SDUT 2930人が生きているシリーズの会議
マルチソース最短問題.島ごとのアルファベット番号を数字にマッピングすれば、通常の最短ルートと同じように処理できます.重辺がある可能性があることに注意してください.
参照コード:
#include
#include
using namespace std;
const int MAX = 52;
const int INF = 0x3f3f3f3f;
int dis[MAX][MAX];
int GetIdx(char ch) {
if(ch>='A' && ch<='Z') return ch-'A';
else return ch-'a'+26;
}
void Floyd() {
for(int k=0; kfor(int i=0; ifor(int j=0; jif(dis[i][k]+dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k]+dis[k][j];
}
}
}
}
int main(int argc, char const *argv[]) {
int n, d;
char s1[2], s2[2];
for(int i=0; i//
for(int j=0; j0;
}
scanf("%d", &n);
for(int i=0; iscanf("%s %s %d", s1, s2, &d);
if(d < dis[GetIdx(s1[0])][GetIdx(s2[0])]) // :
dis[GetIdx(s1[0])][GetIdx(s2[0])] = dis[GetIdx(s2[0])][GetIdx(s1[0])] = d;
}
Floyd();
int min_dis = INF, idx = -1;
for(int i=0; i'Z'); ++i) { // A-Y Z
if(dis[i][GetIdx('Z')] < min_dis) {
min_dis = dis[i][GetIdx('Z')];
idx = i;
}
}
printf("%c %d
", idx+'A', min_dis);
return 0;
}
G-SDUT 2778小明の費用予算
このブログを参考にしてください.
H - SDUT 2162 The Android University ACM Team Selection Contest
やや複雑なシミュレーション問題は、問題の意味に応じてシミュレーションすればいい.
参照コード:
#include
#include
using namespace std;
struct info {
char name[31];
int A;
int T;
int P;
int idx;
} a[10000], b[10000];
int cmp1(info a, info b) {
if(a.T != b.T) return a.T > b.T;
else return a.P < b.P;
}
int cmp2(info a, info b) {
return a.idx < b.idx;
}
int main(int argc, char const *argv[]) {
int c, n, m;
scanf("%d", &c);
for(int i=1; i<=c; ++i) {
if(i > 1) printf("
");
printf("Case %d:
", i);
int cnt = 0;
scanf("%d %d", &n, &m);
for(int j=0; jscanf("%s %d %d %d", a[j].name, &a[j].A, &a[j].T, &a[j].P);
a[j].idx = j;
if(a[j].T) cnt++;
}
if(cnt < m) {
for(int j=0; jprintf("%s
", a[j].name);
}
}
else {
sort(a, a+n, cmp1);
bool has_all_girl = false, found = false;
for(int j=0; jif(a[j].A) has_all_girl = true;
}
if(!has_all_girl) {
for(int j=m; jif(a[j].A) {
a[m] = a[j];
found = true;
break;
}
}
}
if(found) {
sort(a, a+m+1, cmp2);
for(int j=0; j1; ++j) {
printf("%s
", a[j].name);
}
}
else {
sort(a, a+m, cmp2);
for(int j=0; jprintf("%s
", a[j].name);
}
}
}
}
return 0;
}