首先A
很水的题 看看键入的是不是两个数 不是的话no
如果是两个数 但是两个数的个数不同 no
否则符合条件yes
int a[105];
int main()
{
int i,j,k,m,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
a[k]++;
}
int flag1=0,flag2=0;
int cnt=0;
for(i=1;i<=100;i++)
{
if(a[i]!=0)
{
cnt++;
if(flag1==0)
{
flag1=i;
}
else flag2=i;
}
}
if(cnt!=2)
{
printf("NO\n");
}
else
{
if(a[flag1]==a[flag2])
{
printf("YES\n");
printf("%d %d",flag1,flag2);
}
else
{
printf("NO\n");
}
}
return 0;
}
B题 看注释
char a[205];
int book[205];
bool vis[256];
int main()
{
int i,j,k,m,n;
while(scanf("%d",&n)==1)
{
getchar();
int cnt=0;
int flag=0;//如果没有大写字母 flag=0
for(i=1;i<=n;i++)
{
scanf("%c",&a[i]);
if(a[i]>='A'&&a[i]<='Z')
{
flag=1;
book[cnt++]=i;//记录大写字母的下标
}
}
getchar();
int minn=0;//变量名应该是maxn 当时太急了 就没改
mem(vis,false);
cnt--;
for(i=1;i<book[0];i++)//从第一个元素到第一个大写字母
{
vis[a[i]]=true;//如果有就标记为true
}
for(i=97;i<=122;i++)//扫一遍 检测有多少个不重复的字母 小写字母ascll码范围是97~122
{
if(vis[i])
{
minn++;
}
}
for(i=0;i<cnt;i++)//每两个相邻的大写字母之间扫一遍
{
int len=0;
mem(vis,false);
for(j=book[i]+1;j<book[i+1];j++)
{
vis[a[j]]=true;
}
for(j=97;j<=122;j++)
{
if(vis[j])
{
len++;
}
}
minn=max(minn,len);//更新minn的值
}
int len=0;
mem(vis,false);
for(i=book[cnt]+1;i<=n;i++)//最后一个大写字母到末尾扫一遍
{
vis[a[i]]=true;
}
for(j=97;j<=122;j++)
{
if(vis[j])
{
len++;
}
}
minn=max(minn,len);
if(flag==0)//没有大写字母就扫一遍
{
len=0;
mem(vis,false);
for(i=1;i<=n;i++)
{
vis[a[i]]=true;
}
for(j=97;j<=122;j++)
{
if(vis[j])
{
len++;
}
}
minn=max(minn,len);
}
printf("%d\n",minn);
}
return 0;
}
c题 这题错在特判上了 k==1和k==2时输出-1的情况已开始没考虑 一直wa 加了特判就行了
ll dis[10005];
int main()
{
ll i,j,k;
ll a,b,f;
while(scanf("%lld%lld%lld%lld",&a,&b,&f,&k)==4)
{
if(k==1)
{
if(b>=a)
{
printf("0\n");
continue;
}
else
{
if(b<f||b<a-f)
{
printf("-1\n");
}
else
{
printf("1\n");
}
continue;
}
}
if(k==2)
{
if(b<f||b<2*(a-f))
{
printf("-1\n");
continue;
}
}
else if(k!=2)
{
if(b<2*(a-f)||b<2*f)
{
printf("-1\n");
continue;
}
}
dis[1]=f;
dis[2]=2*a-f;
for(i=3;i<=k;i++)
{
if(i&1) //奇数
{
dis[i]=dis[i-1]+2*f;
}
else //偶数
{
dis[i]=dis[i-1]+2*(a-f);
}
}
dis[k+1]=k*a;
ll cnt=0;
ll s=b;
while(1)
{
int pos=upper_bound(dis+1, dis+k+2, b)-dis;
if(pos==k+2)
{
break;
}
cnt++;
pos--;
b=dis[pos]+s;
if(b>=k*a)
{
break;
}
}
printf("%lld\n",cnt);
}
return 0;
}
d题 用的优先队列
看注释
int a[200005];
int vis[200005];
bool book[200005];
struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
int main()
{
int i,j,k,m,n;
priority_queue<int,vector<int>,cmp1>que;//最小值优先 要使得字典序最小 出队的肯定是最小值
scanf("%d",&n);
mem(vis,0);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]++;//记录a[i]出现了几次
}
mem(book,false);
int cnt=0;
for(i=1;i<=n;i++)
{
if(!vis[i])//没有出现过的数 要用来替换掉重复出现的数 所以入队
{
cnt++;//个数
que.push(i);
}
}
for(j=1;j<=n;j++)
{
i=a[j];
if(vis[i]>=2)//如果这个数出现次数>=2 说明要被替换
{
int t=que.top();
if(book[i]==true||t<i)//如果t比i小 那么果断用t替换掉i 使得字典序减小
{
a[j]=t;
que.pop();
vis[i]--;//被替换了 出现的次数要减1
}
else //如果t>=i我们有一次机会选择不替换掉当前的i 而去替换掉后来出现的i 因为如果替换了第一个i 字典序增大了 不符合题意
{
if(book[i]==false)//如果有机会 我们将book[i]设为false
book[i]=true;//这才不替换i了 但下次再遇到i就必须要替换掉了
else
{
a[j]=t;
que.pop();
vis[i]--;
}
}
}
}
printf("%d\n",cnt);
printf("%d",a[1]);
for(i=2;i<=n;i++)
{
printf(" %d",a[i]);
}
printf("\n");
}