1.单词长度
#include<bits/stdc++.h>
using namespace std;
const int N=2e8+10;
string s;
int flag=0;
int main()
{
//纯粹被自己气死,写多了处理空格的就忘记怎么写不处理空格的了
//脑子里只有getline了 真的会谢
while(cin>>s)
{
if(s==".") break;
if(flag) cout<<" ";
flag=1;
if(s.back()!='.') cout<<s.length();
else if(s.size()>1) cout<<s.size()-1;
}
return 0;
}
2.社交网络图中结点的“重要性”计算
社交网络图中结点的“重要性”计算
简单图论,悔不当初的一道题,思路完全是对的,但是自己先害怕了,又被memset(dis,0x3f,sizeof(dis));
导致的内存超限吓到,还有二维数组最大时1e5记成1e4, 而且不确定直接搜if(dis[x][i]==N)
是不是能确定非连通图(事实证明是可以的),完全被吓傻了不敢往下面做,总的来说还是做题不够,怨自己。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int dis[10001][10001];
typedef long long ll;
int n,m,k;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=N;
}
}
//memset(dis,0x3f,sizeof(dis));//导致内存超限
while(m--)
{
int x,y;
cin>>x>>y;
dis[x][y]=1;
dis[y][x]=1;
}
floyd();
cin>>k;
int flag=1;
while(k--)
{
int x;
cin>>x;
double d=0;
for(int i=1;i<=n&&flag;i++)
{
if(dis[x][i]==N)
{
flag=0;
}
if(i==x) continue;
d+=dis[x][i];
}
if(flag==1) printf("Cc(%d)=%.2f\n",x,(n-1)/d);
else printf("Cc(%d)=0.00\n",x);
}
return 0;
}
3. 朋友圈
题目
经典并查集,似乎之前做过,而且自己还做了并查集的笔记,结果一排位啥都忘记了,真的被笑到,做了这么多次并查集还沉浸在自己的手动模拟中。。。。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
int n,m,k;
int pre[N];
int root(int x)
{
return x==pre[x]?x:pre[x]=root(pre[x]);
}
void un(int x,int y)
{
int px=root(x);
int py=root(y);
pre[px]=py;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) pre[i]=i;
while(m--)
{
int k,x,y;
cin>>k;
cin>>x;
while(--k)
{
cin>>y;
un(x,y);
x=y;
}
}
map<int ,int> mp;
for(int i=1;i<=n;i++)
{
mp[root(i)]++;
}
int maxn=0;
for(auto x:mp) if(x.second>maxn) maxn=x.second;
cout<<maxn;
return 0;
}
4. 家谱处理
题目
拿了17分吧,也是用傻傻的方法
s=s.substr(k);
可以吸走s中的k个空格字符,做的时候又忘记了,就在循环呢。。。真的无语
老师代码就是很精妙吧
1. “000”存的是最大祖宗的上一辈,做边界处理,就可以用while(t!="000"&&mp[t]!=qs[0]) t=mp[t];
来求t的最大祖宗是谁了,直接落泪。。。
2. for(k=0;s[k]&&s[k]==' ';k++);
处理空格,以及后面的存放。。都很精妙
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
getchar();
stack<string> st;
st.push("000");
int bk=-2;
map<string,string> mp;//mp[孩子] = 老爸
while(n--)
{
string s;
getline(cin,s);
int k;
for(k=0;s[k]&&s[k]==' ';k++);
s=s.substr(k);
if(k<=bk)//当前空格数小于等于上次,说明上次一定不是当前的父辈
{
for(int i=k;i<=bk;i+=2)
{
st.pop();//把不是父辈的出栈
}
}
mp[s]=st.top();//栈顶是当前的父辈
st.push(s);//本次输入入栈
bk=k;//刷新上次空格数
}
string qs[100];
while(m--)
{
int res=0;
for(int i=0;i<6;i++)
{
cin>>qs[i];
}
string t;
switch(qs[3][0])
{
case 'c':
{
if(mp[qs[0]]==qs[5]) res=1;
break;
}
case 'p':
{
if(mp[qs[5]]==qs[0]) res=1;
break;
}
case 's':
{
if(mp[qs[5]]==mp[qs[0]]) res=1;
break;
}
case 'd':
{
t=qs[0];
while(t!="000"&&mp[t]!=qs[5]) t=mp[t];
if(t!="000") res=1;
break;
}
case 'a':
{
t=qs[5];
while(t!="000"&&mp[t]!=qs[0]) t=mp[t];
if(t!="000") res=1;
break;
}
}
if(res) cout<<"True\n";
else cout<<"False\n";
}
return 0;
}
5. 狼人杀
#include<bits/stdc++.h>
using namespace std;
int n,m,l;
int a[101],b[101];
bool judge(int a[],int b[])
{
int tmp[101];
fill(tmp+1,tmp+n+1,1);
for(int i=1;i<=m;i++) tmp[b[i]]=-1;
int cnt=0;
int langcnt=0;
for(int i=1;i<=n;i++)
{
int id=abs(a[i]);
if(a[i]*tmp[id]<0)
{
cnt++;
if(tmp[i]==-1) langcnt++;
}
}
if(cnt==l&&langcnt>0&&langcnt<m) return true;
else return false;
}
bool dfs(int t)
{
if(t==m+1)
{
if(judge(a,b)) return true;
}
else
{
for(int i=b[t-1]-1;i>=1;i--)
{
b[t]=i;
if(dfs(t+1)) return true;
}
}
return false;
}
int main()
{
cin>>n>>m>>l;
for(int i=1;i<=n;i++) cin>>a[i];
b[0]=n+1;
if(!dfs(1)) cout<<"No Solution";
else
{
cout<<b[1];
for(int i=2;i<=m;i++)
{
cout<<" "<<b[i];
}
}
return 0;
}