7.12练习
Pasha and Stick
note:要充分考虑各种情况和题目设置的陷阱,当木条长度是奇数,不能切成长方形(各边是整数)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,w;
scanf("%d",&n);
if(n%2)
printf("0"); //木条长度是奇数,输出0
else
printf("%d",(n%4==0)?n/4-1:n/4);
return 0;
}
==========================我是分割线=================================
Vika and Squares
**
note:这题也拖了很久,以为很难做,其实是想复杂了…还有,一定要特别留意题目的数据范围
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[201000];
int main()
{
int n,i;
scanf("%d",&n);
int min,len=0,lmax=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]); //(*)
}
min=a[0];
for(i=1;i<n;i++)
{
if(min>a[i])
min=a[i]; /*也可以用min(a[i],mi),不过要把变量变成mi,min设成变量就不能做函数了*/
}
for(i=0;i<n;i++)
a[i]-=min;
for(i=0;i<n;i++)
{
if(a[i])
{
len++;
if(i==n-1)
for(int j=0;a[j]!=0;j++)/*还有一种做法就是在上面(*)a[i+n]=a[i],把头也接到尾*/
len++;
if(len>lmax)
lmax=len;
}
else
len=0;
}
printf("%I64d\n",(long long)n*min+lmax); /* **特别注意这里一定要用long long,n*m有可能爆int **,还有long long输出符最好用%I64d,c++不用%lld,在codeforces上不让过 */
return 0;
}
The Best Gift
**
note:数组尽量开大点,不要开到刚刚好
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n,a;
int m,i;
while(scanf("%d %d",&n,&m)!=EOF)
{
int num[15]={0}; //**原来写的是num[10],m就只能0到9,WA了几次。*尽量开大点,切记!!!***
long long sum=0; //一定要用long long,后面(*)公式相乘可能爆了int
for(i=0;i<n;i++)
{
scanf("%d",&a);
num[a]++; //输入即存入数组num中
}
for(i=1;i<=m;i++)
sum+=(long long)num[i]*(n-num[i]); //(*)强制转化可不要
printf("%I64d\n",sum/2);
}
return 0;
}
加油~争取不放过做不出来的题~