总结:
这次做的还行,模拟92,但是还是有些点过不去。
(1)注意细节,1141是double类型的score求和然后再取整,不然最后一个点过不去。
(2)1141的数据用char *类型,不然可能会超时。
(3)英语不好是硬伤。
(4)注意细节
思路:
eg:D->D1(表示D,连续数量是1),D1->D111(D,数量1;1连续数量是1),以此类推。
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
map <char,int> mp;
int vis[120000];
int main(void)
{
int x,y,i,j,tp,cnt;
scanf("%d%d",&x,&y);
string s1="",s2,ss;
s1+=(char)(x+'0');y--;
while(y--){
int len=s1.length();
s2="";mp.clear();
i=0;memset(vis,0,sizeof(vis));
for(i=0;i<len;i++){
cnt=1;
while(s1[i]==s1[i+1]) i++,cnt++;
vis[i]=cnt;
ss="";s2+=s1[i];
if(cnt>=10){
while(cnt){
ss+=(char)(cnt%10+'0');cnt/=10;
}
reverse(ss.begin(),ss.end());s2+=ss;
}
else s2+=(char)(cnt+'0');
}
s1=s2;//cout<<s1<<endl;
}
cout<<s1;
return 0;
}
思路:
就是sort函数排序,但是如果序号数给出,并且比较小,就用char*;
score求和就先求和再变int类型(这里错了好久)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 100100;
struct Node{
int rk,num;
double score;
char sch[20];
}cur[maxn];
map <string,int> mp;
bool cmp(Node a,Node b)
{
if(a.score!=b.score) return a.score>b.score;
else{
if(a.num!=b.num) return a.num<b.num;
else return strcmp(a.sch,b.sch)<0;
}
}
int main(void)
{
int n,m,i,j,x,y,len,pos=0;
double tp;
char id[20],sc[20];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s %d %s",id,&x,sc);
if(id[0]=='A') tp=x;
else if(id[0]=='B') tp=x/1.5;
else if(id[0]=='T') tp=x*1.5;
for(j=0,len=strlen(sc);j<len;j++)
if(sc[j]>='A'&&sc[j]<='Z') sc[j]=sc[j]-'A'+'a';
if(!mp.count(sc)){
mp[sc]=++pos;
cur[pos].score=tp;
cur[pos].num=1;
strcpy(cur[pos].sch,sc);
}
else{
len=mp[sc];
cur[len].num++;
cur[len].score+=tp;
}
}
for(i=1;i<=pos;i++) cur[i].score=(int)(cur[i].score);
printf("%d\n",pos);
sort(cur+1,cur+pos+1,cmp);
cur[0].score=-1;
for(i=1;i<=pos;i++){
if(cur[i].score!=cur[i-1].score) cur[i].rk=i;
else cur[i].rk=cur[i-1].rk;
printf("%d %s %.0lf %d\n",cur[i].rk,cur[i].sch,cur[i].score,cur[i].num);
}
return 0;
}
思路:
clique n. 派系,小圈子
最多200个点,判断一下给出的点是否两两相连,可判断是不是完全图,
如果是,再从剩余的点中判断是否有点让它还是完全图(这里我没从1-n,好后悔)。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[220],mp[220][220],a[220];
int main(void)
{
int n,m,k,i,j,x,y,ns,fg;
cin>>n>>m;
memset(mp,0,sizeof(mp));
for(i=0;i<m;i++){
cin>>x>>y;
mp[x][y]=mp[y][x]=1;
}
cin>>k;
while(k--){
cin>>ns;fg=0;
memset(vis,0,sizeof(vis));
for(i=0;i<ns;i++){
cin>>a[i];vis[a[i]]=1;
if(fg==0){
for(j=0;j<i;j++)
if(mp[a[i]][a[j]]==0){
fg=1;break;
}
}
}
if(fg==0){
int ff=0;
for(i=1;i<=n;i++)
if(vis[i]==0){
for(j=0;j<ns;j++)
if(mp[a[j]][i]==0) break;
if(j==ns){
ff=1;break;
}
}
if(ff==1) cout<<"Not Maximal"<<endl;
else cout<<"Yes"<<endl;
}
else cout<<"Not a Clique"<<endl;
}
return 0;
}
思路:似乎很难,但是有机关,不存在的点不用判断,
存在的点直接找最LCA就行了,因为是先序遍历,所以最先找的肯定是根节点,所以不用建树,
直接遍历节点看哪个节点最先符合BST的根节点的值大于左子树的值,小于右子树的值的条件,
它就是最近祖先。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxn = 100100;
int a[maxn],n,m;
map <int,int> mp;
void Find(int x,int y)
{
for(int i=1;i<=n;i++){
if((a[i]>=x&&a[i]<=y)||(a[i]<=x&&a[i]>=y)){
if(a[i]==x) printf("%d is an ancestor of %d.\n",x,y);
else if(a[i]==y) printf("%d is an ancestor of %d.\n",y,x);
else printf("LCA of %d and %d is %d.\n",x,y,a[i]);
return ;
}
}
}
int main(void)
{
int i,x,y;
cin>>m>>n;
for(i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i;
while(m--){
cin>>x>>y;
if(mp[x]==0&&mp[y]==0) printf("ERROR: %d and %d are not found.\n",x,y);
else if(mp[x]==0||mp[y]==0) printf("ERROR: %d is not found.\n",mp[x]==0?x:y);
else Find(x,y);
}
return 0;
}