893A:
题意:A,B,C再玩国际象棋 他们的代号是(1,2,3)。A,B必须先玩,输的人下场换人。他们记录了n场比赛记录,第i个数代表第i局赢的人。让你检查这个日志的正确性。
思路:简单模拟。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int vis[4]={0,1,1,0};
int n,m;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
if(vis[m]==0) {cout<<"NO"<<endl;return 0;}
else{
for(int j=1;j<=3;j++)
{
if(j==m)continue;
vis[j]==1?vis[j]=0:vis[j]=1;
}
}
}
cout<<"YES"<<endl;
return 0;
}
893B:
题意:给你一个数,让你找这个数的所有除数中,最大的”特殊的数“。 特殊的数定义为:k=(2^k - 1) * (2*k - 1). 数据范围是n (1 ≤ n ≤ 10^5)
思路:根据公式打个表,暴力找就好了。
#include <bits/stdc++.h>
using namespace std;//100000
int a[8]={1,6,28,120,496,2016,8128,32640};
int poww(int a,int b)
{
int ans=1,base=a;
while(b!=0){
if(b&1!=0)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
int main()
{
int n;
int ma=-1;
scanf("%d",&n);
int sq=sqrt(n);
for(int i=1;i<=sq;i++)
{
if(n%i!=0)continue;
else
{
int temp1=i;
int temp2=n/i;
for(int j=0;j<8;j++)
{
if(temp1==a[j] || temp2==a[j])
ma=max(ma,a[j]);
}
}
}
printf("%d\n",ma);
return 0;
}
893C:
题意:你有一个信息要让所有人知道,所有人都有一个贿赂的价格,并告诉你谁和谁是朋友。如果你贿赂其中一个人,他会把这个消息告诉他的朋友,朋友又会告诉朋友的朋友,问你最小花费。
思路:数据规模挺友好的,简单并查集,注意long long就好,。
#include <bits/stdc++.h>
typedef long long ll;
ll f[100005];
ll find(ll a)
{
if(f[a]==a) return f[a];
else
f[a]=find(f[a]);
return f[a];
}
int main()
{
ll c[100005];
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&c[i]),f[i]=i;
for(int i=1;i<=m;i++)
{
ll a,b,t1,t2;
scanf("%lld%lld",&a,&b);
t1=find(a);
t2=find(b);
if(t1==t2)continue;
else{
(c[t1]<c[t2])?f[t2]=f[t1]:f[t1]=f[t2];
}
}
for(int i=1;i<=n;i++){find(f[i]);}
ll sum=0;
for(int i=1;i<=n;i++)
{
if(f[i]!=i)continue;
else {sum+=c[i];}
}
printf("%lld\n",sum);
return 0;
}
893D:
题意:有一张信用卡,d代表这张卡里最多存款上限。有n个数,第i个数代表第i天的进出账情况,如果是0他就要检查卡里的钱,如果小于0,他就要去还钱把欠的还上,也能多存,但不能超过存储上限。在有解的情况下,问你最少去银行的次数,当然如果某一天进账数使卡里的钱大于d了,则输出-1。
思路:设当前账户的最小值和最大值。当最小值大于d的时候输出-1,检测的时候最大值<0的时候,就要存钱了
#include <bits/stdc++.h>
using namespace std;
struct _st{
int min;
int max;
}c;
int main()
{
int n,d,ans=0;
scanf("%d%d",&n,&d);
c.min=0,c.max=0;
int a;
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(a)
{
c.min+=a,c.max+=a;
if(c.min>d) {printf("-1");return 0;}
if(c.max>d) c.max=d;
}else{
if(c.min<0) c.min=0;
if(c.max<0){c.max=d,ans++;}
}
}
printf("%d\n",ans);
return 0;
}