洛谷 P6529 【[COCI2015-2016#1] KARTE】
一道很简单的模拟,思路很简单,容易理解。
我们不用 \(STL\) 不用 \(struct\) 。
这里提供两种方法。
法 \(1\):
很正常的先读数据,用四个数组记录当前花色,当前点数的牌的数量。如果一张牌出现两次及以上,直接输出 \(GRESKA\)。
然后将四个数组扫一遍,看一看有没有缺牌,缺的话就 就加 \(1\) 。
于是 \(code\)
#include<bits/stdc++.h>
#define FOR(i,j,k) for(int i=(j);i<=(k);i++)
using namespace std;
char tmp;
int x;
int p[14],k[14],h[14],t[14];
int main()
{
while(cin>>tmp)
{
cin>>x;
if(tmp=='P') p[x]++;
else if(tmp=='K') k[x]++;
else if(tmp=='H') h[x]++;
else if(tmp=='T') t[x]++;
if(p[x]>1||k[x]>1||h[x]>1||t[x]>1)
{
printf("GRESKA\n");
return 0;
}
}
int nump=0,numk=0,numh=0,numt=0;
for(int i=1;i<=13;i++)
{
if(p[i]==0) nump++;
if(k[i]==0) numk++;
if(h[i]==0) numh++;
if(t[i]==0) numt++;
}
printf("%d %d %d %d",nump,numk,numh,numt);
return 0;
}
法 \(2\) :
我们一边读一边做。
一开始假设每个花色都没有一张牌。
于是
int ansp=13,ansk=13,ansh=13,anst=13;
然后每读入一张牌,就将对应花色数量减 \(1\) 。
读完,直接输出即可。
\(code\)
#include<bits/stdc++.h>
#define FOR(i,j,k) for(int i=(j);i<=(k);i++)
using namespace std;
char tmp;
int x;
int p[14],k[14],h[14],t[14];
int ansp=13,ansk=13,ansh=13,anst=13;
int main()
{
while(cin>>tmp)
{
cin>>x;
if(tmp=='P') p[x]++,ansp--;
else if(tmp=='K') k[x]++,ansk--;
else if(tmp=='H') h[x]++,ansh--;
else if(tmp=='T') t[x]++,anst--;
if(p[x]>1||k[x]>1||h[x]>1||t[x]>1)
{
printf("GRESKA\n");
return 0;
}
}
printf("%d %d %d %d",ansp,ansk,ansh,anst);
return 0;
}

浙公网安备 33010602011771号