1001 Tutor
加起来除以12 保留2位小数 结尾0不要
我先扩大100倍 模拟一下进位看四舍五入后有几个0 在输出
#include <stdio.h>
int main()
{
int t,i;
double sum,x;
scanf("%d",&t);
while(t--)
{
int flag1 = 0;
int flag2 = 0;
sum = 0;
for(i = 0; i < 12; i++)
{
scanf("%lf",&x);
sum += x;
}
//sum = 12.894;
sum /= 12;
double s = sum;
int k = sum *1000;
k %= 10;
if( k >= 5)
sum += 0.01;
k = sum * 100;
k %= 10;
if(k == 0)
flag1 = 1;
k = sum * 10;
k %= 10;
if(k == 0)
flag2 = 1;
if(!flag1)
printf("$%.2f\n",s);
else if(flag1 && !flag2)
printf("$%.1f\n",s);
else if(flag1 && flag2)
printf("$%.0f\n",s);
}
return 0;
}
1004 D-City
从最后一条边开始做并查集 n-集合数
<span style="color:#000000;">#include <stdio.h>
const int MAX = 10010;
int bin[MAX];
struct node
{
int u,v;
}a[MAX*10];
int find(int x)
{
if(x != bin[x])
return bin[x] = find(bin[x]);
return bin[x];
}
void init(int n)
{
for(int i = 0;i <= n; i++)
bin[i] = i;
}
int main()
{
int n,m;
int i,j;
int cnt = 0;
int ans[MAX*10];
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i = 0;i < m; i++)
{
scanf("%d %d",&a[i].u,&a[i].v);
}
init(n);
cnt = 0;
for(i = m - 1; i > 0; i--)
{
int x = find(a[i].u);
int y = find(a[i].v);
if(x != y)
{
bin[x] = y;
cnt++;
}
ans[i] = n - cnt;
}
ans[m] = n;
for(i = 1;i <= m; i++)
printf("%d\n",ans[i]);
}
return 0;
}</span>
1005 GCD and LCM
设gcd(x,y,z) = n lcm(x,y,z) = m; 那么设p = m/n(m%n != 0 无解)
将想x,y,z分别除以n 得到xx,yy,zz 因为去掉了最大公约数n 所以gcd(xx,yy,zz) = 1 , lcm(xx,yy,zz) = p = m / n;
对p分解因子 假设有a 个t1因子b个t2因子.....
因为gcd(xx,yy,zz) = 1 所以3个中有一个只有0个t1 有一个有a个t1剩下的可以有 0 ~ a个
1.不看0和a 因为3个数不同 有6中 有6*(a-1)中
2.再看0和a 有6种
所以有6*a中 这只是a因子的 b因子和a因子没有影响 所以种数是所有因子的情况相乘
#include <cstdio>
#include <cmath>
int main()
{
int t,i;
int n,m;
int cnt;
__int64 ans;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
if(m%n)
{
printf("0\n");
continue;
}
m /= n;
ans = 1;
int k = sqrt(m) + 1;
for(i = 2;i <= k; i++)
{
if(m == 1)
break;
cnt = 0;
while(m % i == 0)
{
cnt++;
m /= i;
}
if(cnt)
ans *= 6*cnt;
}
if(m != 1)
ans *= 6;
printf("%I64d\n",ans);
}
return 0;
}
1007 Cannon
深搜 开始怕超时 然后就写了下31ms 过了
#include <cstdio>
#include <cstring>
int n,m,q;
int max;
int a[10][10];
int flag = 0;
bool check(int x,int y)
{
int i;
int cnt;
cnt = 0;
for(i = x-1;i >= 0; i--)
{
if(a[i][y])
{
if(a[i][y] == 2 && cnt == 1)
return false;
cnt++;
}
if(cnt > 1)
break;
}
cnt = 0;
for(i = y-1;i >= 0; i--)
{
if(a[x][i])
{
if(a[x][i] == 2 && cnt == 1)
return false;
cnt++;
}
if(cnt > 1)
break;
}
return true;
}
void dfs(int l,int num)
{
if(l == n * m)
{
if(max < num)
max = num;
return;
}
int x = l / m;
int y = l % m;
if(!a[x][y] && check(x,y))
{
a[x][y] = 2;
dfs(l+1,num+1);
a[x][y] = 0;
}
dfs(l+1,num);
}
int main()
{
int i,j;
int u,v;
while(scanf("%d %d %d",&n,&m,&q)!=EOF)
{
memset(a,0,sizeof(a));
for(i = 0;i < q; i++)
{
scanf("%d %d",&u,&v);
a[u][v] = 1;
}
max = 0;
dfs(0,0);
printf("%d\n",max);
}
return 0;
}
1008 Play Game
dp很弱 思路参考网上的 记忆化搜索
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 22;
int dp[MAX][MAX][MAX][MAX];
int a[MAX];
int suma[MAX];
int b[MAX];
int sumb[MAX];
int dfs(int s1,int e1,int s2,int e2)
{
int &p = dp[s1][e1][s2][e2];
if(p)
return p;
int temp = 0;
if(s1 <= e1)
temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1+1,e1,s2,e2));
if(s1 <= e1)
temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1-1,s2,e2));
if(s2 <= e2)
temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1,s2+1,e2));
if(s2 <= e2)
temp = max(temp,suma[e1] - suma[s1-1] + sumb[e2] - sumb[s2-1] - dfs(s1,e1,s2,e2-1));
p = temp;
return p;
}
int main()
{
int t;
int n;
int i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i = 1;i <= n; i++)
{
scanf("%d",&a[i]);
suma[i] = suma[i-1] + a[i];
}
for(i = 1;i <= n; i++)
{
scanf("%d",&b[i]);
sumb[i] = sumb[i-1] + b[i];
}
memset(dp,0,sizeof(dp));
printf("%d\n",dfs(1,n,1,n));
}
return 0;
}