第2回「伝智杯」全国大学生IT技能大会(初戦)

37796 ワード

A P 6363ソフトウェアエンジニアリング実習
タイトルの説明
ある大学の「ソフトウェア工学」の必修科目は理論と実践部分に分かれている.理論部分は同校の教授が授業を完成した.実践部分は第三者の会社が主導し、5週間以内にHTML、css、JavaScript、vue、Python、djangoなどの技術を独学し、チームを組んで実際のインターネットビジネス応用を完成させる必要がある.このコースに参加したのはn(0≦n≦1000)人の学生で、26チームを超えないチームに分かれており、各チームはAからZで表されている.各チームは1つのプロジェクトを完了し、チーム単位ですべてのチーム(自分のチームを含む)に0から100の整数で点数をつけます.学生がこの授業で発生した多くの問題に対する不満(例えば、仕事量が大きすぎて、時間が緊張しすぎて、審査方式が不公平で平等ではない)を鎮めるために、先生は「見た目」が公平な方法で各チームのプロジェクトの得点を決定することにした.あるチームについて、まずすべてのチーム(自分を含む)がこのチームに採点した平均値を計算し、その後、この平均値との差が15点を超えるスコアを除いて(すべてのスコアがすべて取り除かれることがないことを保証します)、最後に残りのスコアに対して平均値を求め、四捨五入してこのチームのプロジェクトのスコアとします.学生一人一人に対して、私たちはすでに彼らのチームの番号と理論成績(0から100分の整数でもある)を知っています.この学生の最後の得点は60%の理論成績に40%のチームの種目の得点を加えて、それから四捨五入して整理します.今、先生はすべての同級生の点数ランキングを知りたいです.最後の得点が高い順から低い順に、学生一人一人の得点と彼のチームを出力してください.
入力フォーマット
1行目の2つの整数nとkは、それぞれ学生数とチーム数を表す.次にn行、各行に1つの整数siと1つの大文字ciがあり、i番目の選手の理論点数とチーム番号を表す.保証チーム番号範囲はAからk文字連続である.次にk行、各行k個の整数.ここで、i行目j列目の整数a ijは、i番目のチームがj番目のチームに与えるスコアを表し、i=jの場合、自己評価である.
出力フォーマット
出力n行は答えを表し,得点の高い学生を優先して出力し,得点が同じ場合はチーム番号の小さい学生を優先して出力する.各行について、まずこの同級生の成績を出力し、それから彼のチーム番号を表す大文字と英語のアルファベットを出力します.
入力#1
6 3 70 A 80 A 65 B 95 B 85 C 90 C 70 90 100 95 88 85 30 47 100
出力#1
93 B 92 C 89 C 76 A 75 B 70 A
説明/ヒント
A組が受け取った点数はそれぞれ70,95,30で、その平均点は65で、95,30は無効な成績として取り除かれたため、A組の種目の得点は70点だった.B組が受け取った点数はそれぞれ90,88,47で平均75点だったが、47は無効成績として除外されたため、B組の種目得点は89点だった.C組が受け取った点数はそれぞれ100,85100で、その平均点は95で、採点が取られていないため、C組の種目の得点は95点だった.
コード#コード#
//                ,           ,              。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define  ll long long
using namespace std;
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
double mapp[10000][10000];
double dui[10000][10000];
double PT[10000];
int len[10000];
struct sm{
	int X;
	char Y;
}MM[10000];
int cmp(sm a,sm b){
	if(a.X==b.X)
	  return a.Y<b.Y;
	else
	  return a.X>b.X;
}
int main(){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
        {
        	int a;
        	char b;
        	scanf("%d %c",&a,&b);
        	dui[b-'A'][len[b-'A']++]=a;
		}
		for(int i=1;i<=k;i++)
		{
			for(int j=1;j<=k;j++)
			{
				cin>>mapp[i][j];
			}
		}
		for(int i=1;i<=k;i++)
		{
			for(int j=1;j<=k;j++)
			{
				PT[i-1]+=mapp[j][i];
			}
			PT[i-1]=1.0*PT[i-1];
			
		}
		for(int i=1;i<=k;i++)
		{
			int ansk=0;
			double NB=0;
			for(int j=1;j<=k;j++)
			{
				double FF=(1.0*PT[i-1]/k-mapp[j][i]);
				if(FF<0)
				FF=-FF;
				if(FF>15.0)
				{
					ansk++;
                    NB+=(mapp[j][i]);
				}
				
			}
			PT[i-1]=1.0*(PT[i-1]-NB)/(k-ansk);
		    int TP=(int)(PT[i-1]+0.5);
		    PT[i-1]=TP;
		}

		    int F=0;
			for(int j=0;j<k;j++)
			{
				for(int L=0;L<len[j];L++)
				{
					dui[j][L]=(int)(dui[j][L]*0.6+PT[j]*0.4+0.5);
				    MM[F].X=dui[j][L];
				    MM[F++].Y=char('A'+j);
				}
			}
			sort(MM,MM+F,cmp);
			for(int i=0;i<F;i++)
			{
				cout<<MM[i].X<<" "<<MM[i].Y<<endl;
			}
	    
    return 0;
}

B P 6364 1024プログラマーフェスティバルオレンジ
展開
タイトルの説明
毎年1024プログラマーフェスティバルでは、黒馬プログラマーが大規模な祝賀イベントを開催しています.今年のプログラマーデーも例外ではなく、クラスごとにオレンジを配った.
クラスにはnnn人の学生が前から後ろに並んでいて、これらの学生の成績を知っています.その中でiii人目の学生の成績はaiaです.iai​.担任は学生たちの前段階の試験成績に基づいてオレンジの数を評価したいと思っています.成績優秀な学生を励ますために、オレンジを出すときは以下の要求を満たす必要があります.
  • 隣の同級生の中で成績の良い同級生のオレンジはもっと多くなければならない.隣接する学生の成績が同じであれば、それらの点数は平等でなければならない.
  • 各学生は少なくとも1つのオレンジを割り当てます
  • 予算が限られているため、担任は要求に合った状況でできるだけ少ないオレンジを出したいと思っています.すみません、少なくともオレンジはいくら用意しなければなりませんか?
    入力フォーマット
    最初の行は10610^6106を超えない正の整数nnnで、学生の数を表しています.
    次の行には、10910^9109を超えないnnn個の非負の整数aia_があります.iaiは、iii番目の同級生の成績を表す.
    出力フォーマット
    答えを出力します.つまり、最低何個のオレンジを用意する必要がありますか.
    入出力サンプル
    入力#1コピー
    5
    3 4 5 4 3

    出力#1コピー
    9

    説明/ヒント
    サンプルの説明:
    1人あたりのオレンジの数はそれぞれ1,2,3,2,1,2,3,2,1,2,3,2,1なので、少なくとも999個用意する必要があります.
    コード#コード#
            
    //          ,                        long long
    #include
    #include
    #include
    #include
    #define ll long long
    using namespace std;
    int main(){
    	int n;
    	cin>>n;
    	ll ans=0;
    	vector<ll>arr(n);
    	vector<ll>A(n,1);
    	vector<ll>B(n,1);
    	for(int i=0;i<n;i++){
    		cin>>arr[i];
    	}
    	for(int i=1;i<n;i++)
    	{
    		if(arr[i]>arr[i-1])
    		{
    			A[i]=A[i-1]+1;
    		}
    	}
    	ans+=A[n-1];
    	for(int i=n-2;i>=0;i--)
    	{
    		if(arr[i]>arr[i+1])
    		{
    			B[i]=B[i+1]+1;
    		}
    		ans+=max(A[i],B[i]);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

    C P 6365衆数出現回数
    タイトルの説明
    伝知専攻の学生の授業では、雰囲気を盛り上げ、ビット演算の知識を強固にするために、学生たちはゲームをしました.
    クラスにはn(n≦106)n(nle 10^6)n(n≦106)人の同級生がいて、学生一人一人が2枚のカード、赤カード、黒カードを手に入れた.各カードには10910^9109を超えない非負の整数があります.第iii位同級生の手に赤いカードの数字はaiaです.iai、ブラックカードの数字はbib_ibi​.
    今は学生一人一人がカードを出す必要があります.学生一人一人が直接赤いカードの数字を出すことができて、あるいは自分の赤いカードの数字と自分の黒いカードの数字をビット別に操作した後の結果を出すことができます.最後に先生はすべての学生が出した数字を集めます.
    これらの数字の中で最も多く出現した数字は衆数である.すべての学生が協力する最良の戦略の下で、私たちは衆数が数字に対応する回数ができるだけ多いことを望んでいます.すみません、出現回数が一番多い数字は何番ですか?
    入力フォーマット
    最初の行、正の整数nnn.
    次にnnn行、iii行目のとき非負の整数ai,bia_i,b_iai、biはiii番目の同級生の手に赤いカードと黒いカードの数字を代表しています.
    出力フォーマット
    答えを表す整数.複数の解があれば、一番小さいものを出力してください.
    入出力サンプル
    入力#1コピー
    4
    21 9
    28 9
    28 3
    17 4

    出力#1コピー
    21

    説明/ヒント
    サンプルの説明:
    衆数の出現回数は最大333回で、以下の2つの方法がある.
  • 111番の学生は直接赤カードを出して、222番の学生は赤黒異或を出して、333番の学生は勝手に出て、444番の学生は赤黒異或を出します.これで1,2,41,21,4番の学生は2121番を打つことができます.
  • 111番の学生は赤と黒の異或を出して、222番の学生は直接赤カードを出して、333番の学生は直接赤カードを出して、444番の学生は勝手に出ます.これで1,2,31,21,3番の学生は282828番を打つことができます.

  • したがって212121と282828はいずれも出現回数が最も多い衆数であり、最大333回、444回の出現は存在しないためである.ただし、多解出力が小さいものがあれば2121を出力してください.
    コード#コード#
    //      
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define  ll long long
    using namespace std;
    const int N =1000005;
    map<int,int>Map;
    int a[N],b[N],n;
    int tag=0;
    int ans=0;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i],cin>>b[i],b[i]^=a[i];  //     
    	for(int i=1;i<=n;i++){
    		if(a[i]!=b[i]){  //           
    			Map[a[i]]++;
    			Map[b[i]]++;
    		}else{
    			Map[a[i]]++;
    		}
    	}
    	for(map<int,int>::iterator it = Map.begin();it!=Map.end();it++){
    	    if(it->second>ans){   //  
    	    	ans=it->second;
    	    	tag=it->first;
    		}else if(it->second== ans && it->first<tag){  //     
    			tag=it->first;
    		}
    	}
    	cout<<tag<<endl;
        return 0;
    }