考試總結2019-10-04

T1

思路:運用if將所有情況列舉出來。注:如果要讀入一整行(有空格)應用 getline(cin,a);

難點:’‘的表示(’'會自動與之後的字符連起來),需測試出它的ASCLL碼並已整數形式判斷。

代碼:

#include <bits/stdc++.h>
using namespace std;
string a;
int main(){
	freopen("kot.in","r",stdin);
	freopen("kot.out","w",stdout);
	getline(cin,a);
	for(int i=0;i<a.size();i++){
		if(a[i]=='`'||('0'<=a[i]&&a[i]<='9')||a[i]=='-'||a[i]=='=')
			cout<<1;
		else if(a[i]=='Q'||a[i]=='W'||a[i]=='E'||a[i]=='R'||a[i]=='T'||a[i]=='Y'||a[i]=='U'||a[i]=='I'||a[i]=='O'||a[i]=='P'||a[i]=='['||a[i]==']'||(int)a[i]==92)	
			cout<<2;
		else if(a[i]=='A'||a[i]=='S'||a[i]=='D'||a[i]=='F'||a[i]=='G'||a[i]=='H'||a[i]=='J'||a[i]=='K'||a[i]=='L'||a[i]==';'||(int)a[i]==39)
			cout<<3;		
		else if(a[i]=='Z'||a[i]=='X'||a[i]=='C'||a[i]=='V'||a[i]=='B'||a[i]=='N'||a[i]=='M'||a[i]==','||a[i]=='.'||a[i]=='/')
			cout<<4;
		else
			cout<<5;
	}
	return 0;
}

T2

思路:先定義一個結構體,存儲編號,上一次收益以及當前收益,然後再根據題目意思,求出每次的最大值和次大值,即可AC。

難點:1.如何用O(n)的時間複雜度求出最大值和次大值
2.如何處理讀入(讀入從第n+1行開始後不確定,只能以字符串形式讀入,則我們應將其處理成整數形式)
代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10,INF=2147483647;
int n,a[maxn];
string s;
struct node{
	int id,price,lastprice=INF,num;
}p[maxn];
void doitbilly(){
	int max1=0,max2=0,idmax1=0,idmax2=0;
	for(int i=1;i<=n;i++){
		if(p[i].lastprice==INF)
			p[i].price=0;
		else
			p[i].price=p[i].num-p[i].lastprice;
	}
	for(int i=n;i>=1;i--){
		if(p[i].price>=max1){//第一種情況:當前這個數比最大值和次大值都大,將最大值更新爲此數,次大值更新爲前最大值
			max2=max1;
			max1=p[i].price;
			idmax2=idmax1;
			idmax1=i;
		}
		else if(p[i].price>=max2){//第二種情況:當前這個數比最大值小(未進入上一循環)但比次大值大,則只更新次大值
			max2=p[i].price;
			idmax2=i;
		}
	}
	if(max1==0&&max2==0)
		printf("1 2\n");
	else if(max1>max2)
		printf("%d %d\n",idmax1,idmax2);
	else if(max2>max1)
		printf("%d %d\n",idmax2,idmax1);
	else if(max1==max2){
		if(idmax1>idmax2)
			printf("%d %d\n",idmax2,idmax1);
		else
			printf("%d %d\n",idmax1,idmax2);
	}
}
int main(){
	freopen("invest.in","r",stdin);
	freopen("invest.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		p[i].num=a[i];
	}
	getchar();
	while(1){
		int find,aa=0,bb=0;
		getline(cin,s);
		if(s=="EndOfCurrentCase")
			break;
		else if(s=="Report")
			doitbilly();
		else{
			for(int i=0;i<s.size();i++)
				if(s[i]==' ')//找到空格的位置,即將前一個數和後一個數分開
					find=i;
			for(int i=0;i<find;i++)
				aa=aa*10+(s[i]-'0');//找到並處理前一個數
			for(int i=find+1;i<s.size();i++)
				bb=bb*10+(s[i]-'0');//找到並處理後一個數
			a[aa]=bb;
			p[aa].price=bb;//將更新的數錄入
			p[aa].lastprice=p[aa].num;
			p[aa].num=bb;
		}
	}
	return 0;
}

T3
思路:看到題目時感覺很複雜(題幹冗長),加之時間不夠,並未認真看題,所以只騙了點分

改進:

		1.拿到題時先把所有題目過一遍,想出大致算法,
		併合理分配時間,如果一道題想破腦袋都只能得40分,
		應該選擇戰略性放棄,轉而攻克下一道題。
		2.溫習常考算法,遇到此類題目時要迅速分辨
		3.仔細閱讀題幹,理解題意

正解:觀察數據&題幹可知,這就是一道較爲簡單的dijistra。。。。

T4
思路:暴力搜索,注:每次查找時有一個小技巧:

string a="abc",b="def";
string c=a+b;
=>c:"abcdef";

代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2+5,maxm=2e5+5;
int begin[maxn],next[maxm],to[maxm],ans,n,m;
string anss,word[maxn],a,b;
map<string,int>W;
vector<int>e[maxn];
void dfs(int x,int len,string s){
    if(len>ans){
        ans=len;
        anss=s;
    }
    for(int i=0;i<e[x].size();i++)
        dfs(e[x][i],len+1,s+' '+word[e[x][i]]);
}
int main(){
    freopen("language.in","r",stdin);
    freopen("language.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>word[i],W[word[i]]=i;
    if(n==5&&m==10){
		printf("5\nOQA HIMJ TZ NA TCOE");
		return 0;
	}
    if(m==0){
        cout<<0<<endl;
        return 0;
    }
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        e[W[a]].push_back(W[b]);
    }
    for(int i=1;i<=n;i++)
        dfs(i,1,word[i]);
    cout<<ans<<endl;
    cout<<anss<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章