这里面的题目都是对大佬比较简单的题目qwq
大佬们轻喷~
这个贪心思路我真的i了 第一次遇到这样的贪心 觉得思路真的很巧妙qwq 所以分享一波
首先对所有的牛排序一波 然后枚举分界点 分界点左边向右移 分界点右边向左移 然后排序 更新其中的最小值
#include
using namespace std;
const int maxn = 55;
int a[maxn],b[maxn],minn=0x3f3f3f3f;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int k;
scanf("%d",&k);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
b[j]=a[j]+k;
for(int j=i+1;j<=n;j++)
b[j]=a[j]-k;
sort(b+1,b+n+1);
minn=min(minn,b[n]-b[1]);
}
printf("%d\n",minn);
}
这一题主要是没有想到要怎么处理(还是太菜了qwq)
首先斜率为1或者-1 可以得出 y+x相等或者y-x相等 然后用两个map记录每一对坐标的a[i]-a[j]和a[i]+a[j] 然后枚举所有的map 遍历a[i] 更新最大值
#include
using namespace std;
const int maxn = 1e3+5;
map m1,m2;
int x[maxn],y[maxn],maxx,n;
int cut(int k1,int k2)
{
int cnt=0;
for(int i=1; i<=n; i++)
{
if((x[i]-y[i]==k1)||(x[i]+y[i]==k2))
cnt++;
}
return cnt;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&x[i]);
for(int i=1; i<=n; i++)
scanf("%d",&y[i]);
for(int i=1; i<=n; i++)
{
m1[x[i]-y[i]]++;
m2[x[i]+y[i]]++;
}
map::iterator it1,it2;
for(it1=m1.begin(); it1!=m1.end(); it1++)
{
for(it2=m2.begin(); it2!=m2.end(); it2++)
{
maxx=max(maxx,cut(it1->first,it2->first));
}
}
printf("%d\n",maxx);
}
我们先可以进行判断,假设数组的和为sum,要分成k个,那么当sum为奇数 k为偶数 或者sum为偶数 k为奇数时,都不满足。记录数组元素中奇数的个数,每遇到一次奇数就输出(因为每一个区间只有一个奇数,奇数前面都是偶数,所以和是奇数),但是这个时候还要判断k是否<=奇数个数,因为不管把哪个奇数加到已经分好的区间,区间和都会变成偶数
#include
#define ll long long
using namespace std;
const int maxn = 2e5+10;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k,num=0,cnt=0;
ll sum=0;
scanf("%d %d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]%2!=0)
num++;
}
if(k>num||(sum%2)!=(k%2))
{
puts("NO");
continue;
}
puts("YES");
for(int i=1;i<=n;i++)
{
if(cnt==k-1) break;
if(a[i]%2!=0) cnt++,printf("%d ",i);
}
printf("%d\n",n);
}
}
首先根据题意
所以我们只需要枚举右边界和c,然后再枚举过程中维护每一个前缀和的值
当a[i]本身是一个完全平方数,他本身就是一个区间 所以num[0]=1
/*Today you do things people will not do,
tomorrow you will do things people can not do.*/
#include
#define ll long long
#define lson l,m,cnt<<1
#define rson m+1,r,cnt<<1|1
//priority_queue ,greater > Q;//优先队列递增
//priority_queueQ;//递减
using namespace std;
const int maxn = 1e5+10;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-6;
int sum[maxn],num[maxn*10];
int main()
{
int n,i,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
sum[i]=x+sum[i-1];
}
ll ans=0;
num[0]++;
//sum[r]-c^2=sum[l-1];
for(int i=1;i<=n;i++) //枚举右端点
{
for(int p=0;p*p<=sum[i];p++) //枚举p
{
ans+=num[sum[i]-p*p];
}
num[sum[i]]++;
}
printf("%lld\n",ans);
}
数学题
我们可以暴力得解 推出答案是n*(n-1)/2 还有一种写法等学会了线性递推再来填坑
#include
#define ll long long
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
ll n;
scanf("%lld",&n);
printf("%lld\n",n*(n-1)/2);
}
}
其实是一道对STL的应用,因为题目没说一定是从左到右,所以可以随便跳,所以直接排序+去重就可以了
/**Today you do things people will not do,
tomorrow you will do things people can not do.**/
#include
#define ll long long
#define lson l,m,cnt<<1
#define rson m+1,r,cnt<<1|1
//priority_queue ,greater > Q;//优先队列递增
//priority_queueQ;//递减
using namespace std;
const int maxn = 5e5+10;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-6;
int a[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
printf("%d\n",unique(a+1,a+n+1)-a-1);
}
}
我们可以先处理处首位是0 首位是1的情况 然后因为只有四种情况 可以暴力匹配
/*Today you do things people will not do,
tomorrow you will do things people can not do.*/
#include
#define ll long long
#define lson l,m,cnt<<1
#define rson m+1,r,cnt<<1|1
//priority_queue ,greater > Q;//优先队列递增
//priority_queueQ;//递减
using namespace std;
const int maxn = 1e2+10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const double PI = acos(-1.0);
const double eps = 1e-6;
int mp1[2*maxn][2*maxn];
int mp0[2*maxn][2*maxn];
int mp[2*maxn][2*maxn][10];
int cut,ans=INF;
int main()
{
int t;
scanf("%d",&t);
for(int k=1; k<=4; k++)
{
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
scanf("%1d",&mp[i][j][k]);
}
}
}
//为1开头
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if((i+j)%2==0)
mp1[i][j]=1;
else
mp1[i][j]=0;
}
}
//为0开头
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if((i+j)%2==0)
mp0[i][j]=0;
else
mp0[i][j]=1;
}
}
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp1[i][j])
cut++;
if(mp[i][j][2]!=mp1[i][j])
cut++;
if(mp[i][j][3]!=mp0[i][j])
cut++;
if(mp[i][j][4]!=mp0[i][j])
cut++;
}
}
ans=min(cut,ans);
cut=0;
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp1[i][j])
cut++;
if(mp[i][j][2]!=mp0[i][j])
cut++;
if(mp[i][j][3]!=mp1[i][j])
cut++;
if(mp[i][j][4]!=mp0[i][j])
cut++;
}
}
ans=min(cut,ans);
cut=0;
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp0[i][j])
cut++;
if(mp[i][j][2]!=mp1[i][j])
cut++;
if(mp[i][j][3]!=mp0[i][j])
cut++;
if(mp[i][j][4]!=mp1[i][j])
cut++;
}
}
ans=min(cut,ans);
cut=0;
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp0[i][j])
cut++;
if(mp[i][j][2]!=mp0[i][j])
cut++;
if(mp[i][j][3]!=mp1[i][j])
cut++;
if(mp[i][j][4]!=mp1[i][j])
cut++;
}
}
ans=min(cut,ans);
cut=0;
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp0[i][j])
cut++;
if(mp[i][j][2]!=mp1[i][j])
cut++;
if(mp[i][j][3]!=mp1[i][j])
cut++;
if(mp[i][j][4]!=mp0[i][j])
cut++;
}
}
ans=min(cut,ans);
cut=0;
for(int i=1; i<=t; i++)
{
for(int j=1; j<=t; j++)
{
if(mp[i][j][1]!=mp1[i][j])
cut++;
if(mp[i][j][2]!=mp0[i][j])
cut++;
if(mp[i][j][3]!=mp0[i][j])
cut++;
if(mp[i][j][4]!=mp1[i][j])
cut++;
}
}
ans=min(cut,ans);
printf("%d\n",ans);
}