Codeforces 911A 水题
题意:给N和N个整数,对于N个数中最小的数,求他们之间的最短距离ans
思路:输入的时候维护minn,然后跑一遍维护最短距离就好了
int main()
{
ll n;
cin>>n;
ll minn=100000000000;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
minn=min(a[i],minn);
}
int ans=10000000; int flag=1; int l=0;
for(int i=0;i<n;i++)
{
if(a[i]==minn&&flag==0)
{
ans=min(i-l,ans);
l=i;
}
if(a[i]==minn&&flag==1)
{
flag=0;
l=i;
}
}
cout<<ans<<endl;
}
Codeforces 911B 贪心水题
题意:给n a b :n指n个盘子 芝士蛋糕有a个,巧克力蛋糕有b个
现在要求:1、每个盘子都要装至少一个蛋糕 2、每个盘子只能装一种蛋糕 3、每个蛋糕都要放在盘子上
要使所有盘子的至少蛋糕数x 最大,输出该x。
思路:把盘子分两类,装芝士蛋糕的 和 装巧克力蛋糕的 考虑贪心
装芝士蛋糕的至少蛋糕数的最小值就是a/i 装巧克力蛋糕的至少蛋糕数的最小值就是b/(n-i)
这里的i指的是装芝士蛋糕的盘子有i个 复杂度o(n)
一般解最小最大问题,也可以二分
int main()
{
int n,a,b;
cin>>n>>a>>b;
int ans=0;
int minsum=100000000;
for(int i=1;i<=n-1;i++)
{
if((a/i)==0||b/(n-i)==0)
continue;
minsum=min(a/i,b/(n-i));
// printf("%d %d\n",a/i,b/(n-i));
ans=max(ans,minsum);
}
cout<<ans<<endl;
}
Codeforces 911C 思维水题
题意:有3个蜡烛 给出整数k1 k2 k3
那么蜡烛1会在x1,x1+k1,x1+2k1,x1+3k1秒会亮
那么蜡烛2会在x2,x2+k2,x2+2k2,x2+3k2秒会亮
那么蜡烛1会在x3,x3+k3,x3+2k3,x3+3k3秒会亮
x1 x2 x3是任意整数
问是否存在x1,x2,x3使得从max(x1,x2,x3)秒开始,每一秒至少有一个蜡烛亮着
存在,输出yes 否则no
思路:可行解很少,直接枚举即可
1 ~ ~
2 2 ~
3 3 3
2 4 4
Codeforces 911D 思维 逆序对还有这种操作
题意:给出n和1到n的一个排列,接下来是m个修改,每个修改给出l,r(l<r)把l 到r之间所有数翻转
比如1 2 3 4 经过修改l=1 r=4变成4 3 2 1
问对于每次修改后的逆序对的对数是奇数个还是偶数个
2s m<=2e5 n<=1000
思路:数据量大,光是过一遍修改时间已经快炸了,所以要往每次修改都要O(1)方向想
首先,最开始排列的逆序对的奇偶肯定要先求。O(n2)可以的了
其次,注意到,对lr子区间的每一个数翻转并不影响其对lr子区间外的逆序对个数
重点:假设lr 子区间有x个逆序对,翻转后有 总对数-x 个逆序对
现在的x无法求,应该说没时间求。
而总对数就是子区间的长度 t 。t*(t-1)/2;
若子区间总对数是偶数,那么不管x是奇数还是偶数,翻转后不变 偶减奇=奇。偶减偶=偶
若子区间总对数是奇数,那么不管x是奇数还是偶数,翻转后奇偶性改变 奇减奇=偶。奇减偶=奇
所以,每次修改只要看子区间总对数的奇偶就行了
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
int ans=0;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
if(a[i]>a[j])
ans++;
}
}
int now=0;
if(ans%2==1)//最开始的奇偶
now=1;
else
now=0;
int m;
cin>>m;
for(int i=0; i<m; i++)
{
int l,r;
scanf("%d %d",&l,&r);
if(l==r)//若l=r 答案不变
{
if(now==1)
{
printf("odd\n");
continue;
}
else
{
printf("even\n");
continue;
}
}
int t=(r-l+1);
if((t*(t-1)/2)%2==1)//ji
{
now=(now+1)%2;//change
}
if(now==1)
{
printf("odd\n");
}
else
{
printf("even\n");
}
}
}