PAT _(刷题1) 1108 1109 1112 1113 1114 1116 1117 1118

目录

1108 Finding Average (20分) (sscanf sprintf)

1109 Group Photo (25分) 

1112 Stucked Keyboard (20分) (map set)

1113 Integer Set Partition (25分) (水题)

1114 Family Property (25分) (并查集)

1116 Come on! Let's C (20分) (水题)

1117 Eddington Number (25分)(水题)

1118 Birds in Forest (25分)(并查集)


 

1108 Finding Average (20分) (sscanf sprintf)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back 
using namespace std;
const int maxn=100005;
int n,cnt;
double sum,num[105];
bool is[105];
double getnum(string tmp){
	double ans=0.0;
	int pos=-1; //小数点位置 
	for(int i=0;i='a' && tmp[i]<='z' || tmp[i]>='A' && tmp[i]<='Z'){
			return false;
		}else if(tmp[i]=='.'){
			point++;
			flag=true; //出现. 
		}else if(flag && tmp[i]>='0' && tmp[i]<='9'){
			dec++;
		}
	}
	if(point>1){
		return false;
	}else if(dec>2){
		return false;
	}else{
		num[i]=getnum(tmp);
		if(num[i]>1000 || num[i]<-1000) return false;
		return true;
	}	
}
int main(){
	string tmp;
	cin>>n;
	for(int i=0;i>tmp;
		if(judge(i,tmp)){
			cnt++;
			is[i]=true;
		}else{
			is[i]=false;
			printf("ERROR: %s is not a legal number\n",tmp.c_str());
		}
	}
	for(int i=0;i
⽤⾮常好⽤的sscanfsprintf即可解决~ sscanf() – 从⼀个字符串中读进与指定格式相符的数据
sprintf() – 字符串格式化命令,主要功能是把格式化的数据写⼊某个字符串中

正解:

#include 
#include 
#include 
using namespace std;
int main() {
     int n, cnt = 0;
     char a[50], b[50];
     double temp, sum = 0.0;
     cin >> n;
     for(int i = 0; i < n; i++) {
         scanf("%s", a);
         sscanf(a, "%lf", &temp);
         sprintf(b, "%.2f",temp);
         int flag = 0;
         for(int j = 0; j < strlen(a); j++)  if(a[j] != b[j]) flag = 1;
         if(flag || temp < -1000 || temp > 1000) {
                printf("ERROR: %s is not a legal number\n", a);
                continue;
         } else {
                sum += temp;
                cnt++;
         }
      }
         if(cnt == 1)
             printf("The average of 1 number is %.2f", sum);
         else if(cnt > 1)
             printf("The average of %d numbers is %.2f", cnt, sum / cnt);
         else
             printf("The average of 0 numbers is Undefined");
     return 0; 
}

1109 Group Photo (25分) 

题意:输出拍照的方阵队形(k行)

思路:先利用sort对所有人按身高递减排序,然后一行一行的输出,最后一行人数=n-(n/k)*(k-1) ;其他行人数=n/k;

每行最高的在中间m/2位置,然后,按照“方阵中每行最高的人”的右->左,给人排队

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back 
using namespace std;
const int maxn=10005;
int n,k;
struct node{
	string name;
	int height;
}num[maxn];
bool cmp(node a,node b){
	return a.height==b.height?a.nameb.height;
}
int main(){
	cin>>n>>k;
	string na;int he;
	for(int i=0;i>na>>he;
		num[i].name=na;
		num[i].height=he;
	}
	sort(num,num+n,cmp);
	
	int t = 0, row = k,m;
 	while(row) {
 		if(row == k) {
 			m = n - n / k * (k - 1); //最后一行的人数 
 		} else {
 			m = n / k;
 		}
 		vector ans(m);
 		ans[m / 2] = num[t].name;
 		// 左边1列
 		int j = m / 2 - 1;
 		for(int i = t + 1; i < t + m; i = i + 2)
 			ans[j--] = num[i].name;
 		// 右边1列
 		j = m / 2 + 1;
 		for(int i = t + 2; i < t + m; i = i + 2)
 			ans[j++] = num[i].name;
 		// 输出当前排
 		cout << ans[0];
 		for(int i = 1; i < m; i++)
 			cout << " " << ans[i];
 		cout << endl;
 		t = t + m;
 		row--;
 	}
	return 0;	
}
/*
Joe 190
Tom 188
Nick 186
Bob 175
Mike 170
Ann 168
Eva 168
Amy 160
Tim 160
John 159
*/

 

1112 Stucked Keyboard (20分) (map set)

18分待改

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back
using namespace std;
const int maxn=100005;
int k;
string str;
map isbroken;
map mp;
set st;
vector ans;
int main(){
	cin>>k>>str;
	int len=str.length();
	for(int i=0;i

 

1113 Integer Set Partition (25分) (水题)

#include
#include
#include
#define pb push_back 
using namespace std;
const int maxn=100005;
int n,sum,sum1;
int num[maxn]; 

int main(){
	scanf("%d",&n);
	for(int i=0;i

1114 Family Property (25分) (并查集)

本题很有借鉴意义的

注意点:union规则: father[大id]=小id

void Union(int a, int b) {
	 int faA = find(a);
 	 int faB = find(b);
 	 if(faA > faB)
 		father[faA] = faB;
 	 else if(faA < faB)
 		father[faB] = faA; 
}
#include 
#include 
using namespace std;
struct DATA {
 	int id, fid, mid, num, area;
 	int cid[10];
}data[1005];
struct node {
 	int id, people;
 	double num, area; //家庭成员的最⼩编号 家庭⼈⼝数 ⼈均房产套数 ⼈均房产⾯积
 	bool flag = false; 
}ans[10000];
int father[10000];
bool visit[10000];
int find(int x) {
 	return x==father[x]?x:father[x]=find(father[x]); 
}
void Union(int a, int b) {
	 int faA = find(a);
 	 int faB = find(b);
 	 if(faA > faB)
 		father[faA] = faB;
 	 else if(faA < faB)
 		father[faB] = faA; 
}
int cmp1(node a, node b) {
 	if(a.area != b.area)
 		return a.area > b.area;
 	else
 		return a.id < b.id; 
}
int main() {
 	int n, k, cnt = 0;
 	scanf("%d", &n);
 	for(int i = 0; i < 10000; i++)
 		father[i] = i;
 	for(int i = 0; i < n; i++) {
 		scanf("%d %d %d %d", &data[i].id, &data[i].fid, &data[i].mid, &k);
 		visit[data[i].id] = true;
 		if(data[i].fid != -1) {
 			visit[data[i].fid] = true;
 			Union(data[i].fid, data[i].id);
 		}
 		if(data[i].mid != -1) {
 			visit[data[i].mid] = true;
 			Union(data[i].mid, data[i].id);
 		}
 		for(int j = 0; j < k; j++) {
 			scanf("%d", &data[i].cid[j]);
 			visit[data[i].cid[j]] = true;
 			Union(data[i].cid[j], data[i].id);
 		}
 		scanf("%d %d", &data[i].num, &data[i].area);
 	} //构造并查集
	  
 	for(int i = 0; i < n; i++) {
 		int id = find(data[i].id);  //每个cluster的最小id是这个cluster的father
 		ans[id].id = id;
 		ans[id].num += data[i].num;
 		ans[id].area += data[i].area;
 		ans[id].flag = true;
 	}
 	for(int i = 0; i < 10000; i++) {
 		if(visit[i])
 			ans[find(i)].people++;
 		if(ans[i].flag)
 			cnt++;  //cluster数
 	}
 	for(int i = 0; i < 10000; i++) {
 		if(ans[i].flag) {
 			ans[i].num = (double)(ans[i].num * 1.0 / ans[i].people);
 			ans[i].area = (double)(ans[i].area * 1.0 / ans[i].people);
 		}
 	}
 	sort(ans, ans + 10000, cmp1);
 	printf("%d\n", cnt);
 	for(int i = 0; i < cnt; i++)
 		printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].people, ans[i].num,ans[i].area);
 	return 0; 
}

 

1116 Come on! Let's C (20分) (水题)

  • 0、 The Champion will receive a "Mystery Award" (such as a BIG collection of students' research papers...).
  • 1、 Those who ranked as a prime number (素数)will receive the best award -- the Minions (小黄人)!
  • 2、 Everyone else will receive chocolates.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pb push_back 
using namespace std;
const int maxn=100005;
int n;
map mp; //id-index
struct node{
	int id;
	int rank; //1-n
}num[10005];
bool isprime(int x){
	if(x==2 || x==3) return true;
	for(int i=2;i*i<=x;i++){
		if(x%i==0) return false;
	}
	return true;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>num[i].id;
		num[i].rank=i;
		mp[num[i].id]=i;
	}
	int t;
	cin>>t;
	int tmp,ra;
	while(t--){
		cin>>tmp;
		if(mp.find(tmp)!=mp.end()){
			printf("%04d: ",tmp);
			if(mp[tmp]!=-1){
				ra=num[mp[tmp]].rank;
				if(ra==1){
					cout<<"Mystery Award\n";
				}else if(isprime(ra)){
					cout<<"Minion\n";
				}else{
					cout<<"Chocolate\n";
				}
				mp[tmp]=-1;
			}else cout<<"Checked\n";
		}else{
			printf("%04d: Are you kidding?\n",tmp);    
		}
	}	
	return 0;	
}

1117 Eddington Number (25分)(水题)

"Eddington number", E -- that is, the maximum integer E such that it is for E days that one rides more than E miles.

Sample Input:

10
6 7 6 9 3 10 8 2 7 8

Sample Output:

6

一连4天,每次骑行超过6 miles

E,即满⾜有E天骑⻋超过E英⾥的最⼤整数E
 

本题重点在于题意理解:在数组a中存储n天的公⾥数,对n个数据从⼤到⼩排序,i表示了骑⻋的天数,那么满⾜a[i] > i+1

的最⼤ i+1 即为所求
#include 
#include 
using namespace std;
int a[1000000];
int main() {
     int n, e = 0;
     scanf("%d", &n);
     for(int i = 0; i < n; i++)
         scanf("%d", &a[i]);
     sort(a, a+n, greater());
     while(e < n && a[e] > e+1) e++;
     printf("%d", e);
     return 0; 
}

 

1118 Birds in Forest (25分)(并查集)

#include 
using namespace std;
int n, m, k;
const int maxn = 10010;
int fa[maxn] = {0}, cnt[maxn] = {0};
int findFather(int x) {
    return x==fa[x]?x:fa[x]=findFather(fa[x]);
}
void Union(int a, int b) {
    int faA = findFather(a);
    int faB = findFather(b);
    if(faA != faB) fa[faA] = faB; 
}
bool exist[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= maxn; i++)
        fa[i] = i;
    int id, temp;
    for(int i = 0; i < n; i++) {
        scanf("%d%d", &k, &id);
        exist[id] = true;
        for(int j = 0; j < k-1; j++) {
            scanf("%d", &temp);
            Union(id, temp);
            exist[temp] = true;
        }
    }
    for(int i = 1; i <= maxn; i++) {
        if(exist[i] == true) {
            int root = findFather(i);
            cnt[root]++;
        }
    }
    int numTrees = 0, numBirds = 0;
    for(int i = 1; i <= maxn; i++) {
        if(exist[i] == true && cnt[i] != 0) {
            numTrees++;
            numBirds += cnt[i];
         }
    }
    printf("%d %d\n", numTrees, numBirds);
    scanf("%d", &m);
    int ida, idb;
    for(int i = 0; i < m; i++) {
        scanf("%d%d", &ida, &idb);
        printf("%s\n", (findFather(ida) == findFather(idb)) ? "Yes" : "No");
    }
    return 0; 
}

 

 

 

 

 

 

 

你可能感兴趣的:(pat,算法)