1006
三角形面积公式: 其中P为三角形的半周长。(海伦公式)
打表代码:http://blog.csdn.net/dl962454/article/details/78447789
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i = 4; i <= 10000; i++){
int p = (3 * i) / 2;
int area = p * (p - i - 1) * (p - i + 1) * (p - i);
bool flag = false;
for(int j = 1; j <= sqrt(area) + 1; j++){
if(j * j == area && i >= n){
flag = true;
printf("%d\n", i);
break;
}
}
if(flag) break;
}
}
return 0;
}
F(n)= 4*F(n-1)-F(n-1);
1009
高精度:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
int t;
char a[500],b[500];
int c[500];
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",a);
for(int ii=0;ii<3;ii++){
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",b);
int i=0,j=0,k=0,r=0;
int lena,lenb;
lena = strlen(a);
lenb = strlen(b);
for(i=lena-1,j=lenb-1;i>=0&&j>=0;i--,j--){
int p=(a[i]-'0')+(b[j]-'0')+r;
r=p/10;//进位
c[k++]=p%10;//余数加到数组中
}
while(i>=0){ //如果b中的数加完了
int p=(a[i]-'0')+r;
r=p/10;
c[k++]=p%10;
i--;
}
while(j>=0){ //如果a中的数加完了
int p=(b[j]-'0')+r;
r=p/10;
c[k++]=p%10;
j--;
}
if(r){//判断最高位有没有进位
c[k++]=r;
}
int jj=0;
for(int kk=k-1;kk>=0;kk--,jj++)
a[jj]=c[kk]+'0';
//cout<<a<<endl;
}
cout<<a<<endl;
int len=strlen(a);
}
return 0;
}
1011
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int cmp(int a,int b){
return a<b;
}
int a[505],dis[505]; //与前面一个数的间隙
int main(){
int t;
scanf("%d",&t);
int n;
while(t--){
memset(a,0,sizeof(a));
memset(dis,0,sizeof(dis));
int sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=2;i<n-1;i++)
sum+=(a[i]-a[i-1]-1);
//cout<<sum<<endl;
int x=a[1]-a[0]-1,y=a[n-1]-a[n-2]-1;
if(x>=y)
sum+=x;
else
sum+=y;
printf("%d\n",sum);
}
return 0;
}
1012
读题重要啊,一旦有Ei为0,交集就为0,所以都要用才行。所以就是这个思路了:
子节点数为x(包括自己),总结点数为n,
答案在中间部分,要满足x>=k&&n-x>=k;
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
vector<int> V[maxn];
int n,k,ans,cnt[maxn];
void dfs(int u,int f){
int v;
for(int i=0;i<V[u].size();i++){
int v=V[u][i];
if(v==f) continue; //f是父节点,不让他走回去
dfs(v,u);
cnt[u]+=cnt[v]; //cnt[v]为子节点数,加到父节点上
if(cnt[v]>=k&&n-cnt[v]>=k)
ans++;
}
return ;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d%d",&n,&k);
for (int i=0;i<=n;i++) V[i].clear();
for(int i=0;i<n-1;i++){
scanf("%d%d",&a,&b);
V[a].push_back(b);
V[b].push_back(a);
}
ans = 0;
fill(cnt,cnt+maxn,1);
dfs(1, 0);
printf("%d\n", ans);
}
return 0;
}