最終スコア(アナログ+ STL)のPAT(初級)1080 MOOC

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_45458915/article/details/102755133

トピックリンク:こちらをクリックしてください

効果の対象:学生は、学生のプログラミング、B中間試験の点数、Cの学生の最終試験結果のスコアを与えられている、いくつかのルールがあります。

  1. 総定格:
    1. 結果は中間試験最終試験よりも大きい場合:G = G_ {中間} * 0.4 + G_ {最終} * 0.6
    2. それ以外の場合:G = G_ {最終}
  2. 適格定義プログラミングは200以上であり、丸め後のスコアは60総合以上であります
  3. 優先順位付けは、次のとおりです。
    1. 全体的に分類プレス
    2. 学生ID、その後ソート

上記の規則を満たすとともに、資格の学生は、出力情報を降順

トピック分析:簡単なシミュレーションの質問のアイデア、それが4つのまたは5の数字である場合は、このトピックでは、文字列に難易学生数アップになるだろうし、我々は直接オープン構造と店舗情報ことができますが、学習以来のため、文字列への変更は、我々はベクトル便利な順序付けをマッピングするためのマップから、最終的なエクスポートマップで、構造体に持っていない、それが最終的にできる直接出力する、アイデアはシンプルですが、少し厄介な実装は、(ルックスをコードを参照混沌)が、STL依存症患者として、書き込みアップのための非常に滑らかです

小さな詳細はトピックに注意を払う必要がありますすることは現実には本当に素敵な場合は、学生の試験、59.9ポイントは、?(emmmカウントの修飾リストであることを意味し、60人を丸めた後、以上の有資格者を必要とし我々は唯一のリストに格納された整数の全体構造を格納する必要がある場合)ああ、この小さなテストポイント3は、細部に対応し、計算(INT)に四捨五入された(A + 0.5)、線

そして、小さなディテールがあります、私はこの問題に気づいたが、中間試験と最終試験は、もともと私が直接、中間試験の点数が判断するかどうかを測るためにしようとしていた、0人を獲得することを掘っ意図的がないことを知りません0プログラムのスコアが低い場合は、有効期限に審査に参加しますが、この詳細は、それが初期値になることを考慮する人が-1に初期化されているかどうか、そう誰にでも、あなたは少しカット枝をスコアリングすることができますプログラムがある、つまり、フォローアップ操作を必要としません学生で200ポイント

これは、直接コードに、おそらくケースです。

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;
 
typedef long long LL;
 
const int inf=0x3f3f3f3f;
 
const int N=1e5+100;

struct Node
{
	int pro;//编程
	int mid;//期中
	int fin;//期末
	int all;//总评
	Node()//初始化为-1
	{
		pro=mid=fin=all=-1;
	}
};

map<string,Node>mp;

bool cmp(pair<string,Node> a,pair<string,Node> b)
{
	if(a.second.all!=b.second.all)//总评降序
		return a.second.all>b.second.all;
	return a.first<b.first;//学号升序
}

int main()
{
//  freopen("input.txt","r",stdin);
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	while(a--)
	{
		string s;
		int num;
		cin>>s>>num;
		if(num<200)//剪枝
			continue;
		mp[s].pro=num;
	}
	while(b--)
	{
		string s;
		int num;
		cin>>s>>num;
		if(mp[s].pro==-1)//剪枝
			continue;
		mp[s].mid=num;
	}
	while(c--)
	{
		string s;
		int num;
		cin>>s>>num;
		if(mp[s].pro==-1)//剪枝
			continue;
		mp[s].fin=num;
	}
	vector<pair<string,Node>>ans;
	copy(mp.begin(),mp.end(),back_inserter(ans));//把map扔到vector里
	for(int i=0;i<ans.size();i++)//按照规则计算总评
	{
		if(ans[i].second.mid>ans[i].second.fin)
			ans[i].second.all=(int)(0.4*ans[i].second.mid+0.6*ans[i].second.fin+0.5);
		else
			ans[i].second.all=ans[i].second.fin;
	}
	sort(ans.begin(),ans.end(),cmp);//按照规则排序
	for(int i=0;i<ans.size();i++)//输出
	{
		if(ans[i].second.all<60)//若当前学生的总评已经不合格了,及时退出
			break;
		printf("%s %d %d %d %d\n",(ans[i].first).c_str(),(ans[i].second).pro,(ans[i].second).mid!=-1?(ans[i].second).mid:-1,(ans[i].second).fin!=-1?(ans[i].second).fin:-1,(ans[i].second).all);
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
   	
   	
   	
   	
     
     
     
     
     
     
     
    return 0;
}

 

おすすめ

転載: blog.csdn.net/qq_45458915/article/details/102755133