思路:運用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;
}
思路:先定義一個結構體,存儲編號,上一次收益以及當前收益,然後再根據題目意思,求出每次的最大值和次大值,即可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;
}