CF 479 Div.3
A:水题
#include <iostream>
using namespace std;
int main()
{
int n,k;
while(cin>>n>>k)
{
while(k--)
{
if(n%10==0)
{
n/=10;
}
else
{
n--;
}
}
cout<<n<<endl;
}
return 0;
}
B:还是水题。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
char s[105];
int b[30][30]= {0};
cin>>s;
for(int i=0; i<n-1; i++)
{
char a[3];
a[0]=s[i];
a[1]=s[i+1];
a[2]='\0';
b[a[0]-'A'][a[1]-'A']++;
}
int ma=-1;
char t1,t2;
for(int i=0; i<30; i++)
{
for(int j=0; j<30; j++)
{
if(b[i][j]>ma)
{
t1=(char)i+'A';
t2=(char)j+'A';
ma=b[i][j];
}
}
}
cout<<t1<<t2<<endl;
}
return 0;
}
C:if判断时最好分开写,不要一直else if,会出现意想不到的错误!#include <bits/stdc++.h>
using namespace std;
int n,k,a[200010];
int main()
{
while(cin>>n>>k)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
if(k==0)
{
if(a[0]>1)
cout<<"1";
else
cout<<-1;
}
else if(k==n)
{
cout<<a[n-1];
}
else
{
if(a[k]==a[k-1])
cout<<-1;
else
cout<<a[k-1];
}
cout<<endl;
}
return 0;
}
D:拓扑排序
#include <bits/stdc++.h>
using namespace std;
#define maxn 105
typedef long long ll;
vector<ll> ma[maxn];
//vector<ll> num;
ll num[maxn];
int in[maxn]={0};
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
continue;
if((num[i]%3==0&&num[i]/3==num[j])||(num[i]*2==num[j]))
{
ma[i].push_back(j);
in[j]++;
}
}
}
int cnt=0;
vector<ll> ans;
while(1)
{
for(int i=0;i<n;i++)
{
if(in[i]==0)
{
in[i]=-1;
cnt++;
ans.push_back(num[i]);
for(int j=0;j<ma[i].size();j++)
{
in[ma[i][j]]--;
}
break;
}
}
if(cnt==n)
break;
}
for(int i=0;i<ans.size();i++)
{
cout<<ans[i]<<" ";
}
}
return 0;
}
num不能用vector声明,,如果那样的话不能直接cin>>num[i]。
E:并查集(因为是找单环的个数,所以合并度为2的点)
#include <bits/stdc++.h>
using namespace std;
#define maxn 200010
struct a
{
int x,y;
a(int x,int y):x(x),y(y){}
a(){}
};
int pre[maxn];
int du[maxn]={0};
int cnt=0;
int Find(int x)
{
int t,p=x;
while(x!=pre[x])
{
x=pre[x];
}
while(x!=p)
{
t=pre[p];
pre[p]=x;
p=t;
}
return x;
}
void join(int x,int y)
{
x=Find(x);
y=Find(y);
if(x==y)
cnt++;
else
pre[y]=x;
}
int main()
{
int x,y;
for(int i=0;i<maxn;i++)
{
pre[i]=i;
}
int n,c;
a a[maxn];
while(cin>>n>>c)
{
for(int i=0;i<c;i++)
{
cin>>x>>y;
du[a[i].x=x]++;
du[a[i].y=y]++;
}
for(int i=0;i<c;i++)
{
if(du[a[i].x]==2&&du[a[i].y]==2)
join(a[i].x,a[i].y);
}
cout<<cnt<<endl;
}
return 0;
}
F:最长上升连续子序列
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
int main()
{
int n;
while(cin>>n)
{
int a[200010];
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i]=x;
mp[x]=mp[x-1]+1;
}
int maxx=0,pos;
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
if(it->second>maxx)
{
maxx=it->second;
pos=it->first;
}
}
pos=pos-maxx+1;
cout<<maxx<<endl;
for(int i=1;i<=n;i++)
{
if(a[i]==pos)
{
cout<<i<<" ";
pos++;
}
}
cout<<endl;
}
return 0;
}