水体欢乐赛O(∩_∩)O
A - Easy Marks SPOJ - EASYMRKS
题意:你现在已经进行了n场考试并且知道了这n场考试的分数,现在你只剩下一场考试,问这场考试考多少分才能使得这n+1场考试的平均分为k。
题解:k*(n+1)-sum。
B - Candy I SPOJ - CANDY
题意:有n个小朋友,每个小朋友都有一些糖,现在要糖多的小朋友分给糖少的小朋友一些糖使得每个小朋友的糖果数量相同。输出有多少糖要被分出来,如果不能均分则输出-1.
题解:求平均数。。。
C - Rectangles SPOJ - AE00
题意:你有n个小正方形,问你能拼出几种不同形状的矩形(小正方形不一定全部用上)。
题解:打表。
#include<iostream>
#include<cstdio>
using namespace std;
int f[10000+10];
int main()
{
f[1]=1;
for(int i=2;i<=10000;i++)
{
int ans=0;
for(int j=1;j<=i;j++)
{
if(i%j==0)
{
ans++;
}
}
f[i]=f[i-1]+ans/2;
if(ans%2==1) f[i]++;
}
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",f[n]);
}
}
D - Alchemy URAL - 1573
题意:给你蓝红黄三种颜色药水的数量,再给你需要用到的药水颜色,不同的放置顺序会得到不同的产物,输出有多少种调配方法(相同颜色的药水也都是个不相同的)。
题解:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
int k;
scanf("%d",&k);
int flag1=0,flag2=0,flag3=0;
for(int i=1;i<=k;i++)
{
string x;
cin>>x;
if(x=="Blue") flag1=1;
if(x=="Red") flag2=1;
if(x=="Yellow") flag3=1;
}
if(flag1&&!flag2&&!flag3)
{
printf("%d\n",a);
}
if(!flag1&&flag2&&!flag3)
{
printf("%d\n",b);
}
if(!flag1&&!flag2&&flag3)
{
printf("%d\n",c);
}
if(flag1&&flag2&&!flag3)
{
printf("%d\n",a*b);
}
if(flag1&&!flag2&&flag3)
{
printf("%d\n",a*c);
}
if(!flag1&&flag2&&flag3)
{
printf("%d\n",b*c);
}
if(flag1&&flag2&&flag3)
{
printf("%d\n",a*b*c);
}
if(!flag1&&!flag2&&!flag3)
{
printf("0\n");
}
}
}
E - Genealogical Tree URAL - 1022
题意:在一个火星人家族中,每个火星人只会记得自己某一些后代,让你输出这个家族的出生顺序(都是一脉单传==)。
题解:拓扑排序
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=10000+10;
queue<int>q;
struct cc{
int from,to;
}es[maxn];
int first[maxn],nxt[maxn];
int ru[105];
int tot=0;
void build(int ff,int tt)
{
es[++tot]=(cc){ff,tt};
nxt[tot]=first[ff];
first[ff]=tot;
}
bool vis[105];
int n;
int ans[105];
int m=0;
void top_sort()
{
for(int i=1;i<=n;i++)
{
if(ru[i]==0&&!vis[i])
{
q.push(i);
vis[i]=1;
}
}
while(!q.empty())
{
int u=q.front(); q.pop();
m++;
ans[m]=u;
for(int i=first[u];i;i=nxt[i])
{
int v=es[i].to;
ru[v]--;
}
}
if(m!=n)
{
top_sort();
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
while(scanf("%d",&x)!=EOF)
{
if(x==0) break;
build(i,x);
ru[x]++;
}
}
top_sort();
for(int i=1;i<n;i++)
{
cout<<ans[i]<<" ";
}
cout<<ans[n]<<endl;
}
F - GCD The Largest UVA - 12708
题意:给你一个数字n,问你从1到n数字之间的最大公约数是多少。
题解:打表找规律
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
long long x;
scanf("%lld",&x);
printf("%lld\n",x/2);
}
}
}
G - Peter’s Smokes UVA - 10346
题意:你有n根香烟,每k根抽完的香烟剩余部分又能作为一根新的香烟,问最后能抽几根香烟。
题解:模拟
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long n,k;
while(scanf("%lld%lld",&n,&k)!=EOF)
{
long long ans=n;
long long now=n;
while(now>=k)
{
ans+=now/k;
now=now%k+now/k;
}
printf("%lld\n",ans);
}
}
H - Blown Garland CodeForces - 758B
题意:有四种颜色的灯RBYG按某种顺序排列,坏了的灯用!表示,输出每种颜色的灯坏的数量。
题解:dfs,每种排列顺序都试一遍。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
char a[5]={' ','R','Y','B','G'};
bool vis[5];
char b[5];
string s;
void dfs(int x)
{
if(x>4)
{
string now="";
for(int i=1;i<=4;i++)
{
now+=b[i];
}
int n=s.length();
bool flag=1;
for(int i=0;i<n;i++)
{
if(s[i]!='!'&&s[i]!=now[i%4])
{
flag=0;
break;
}
}
if(flag)
{
int ans1=0,ans2=0,ans3=0,ans4=0;
for(int i=0;i<n;i++)
{
if(s[i]=='!')
{
if(now[i%4]=='R') ans1++;
if(now[i%4]=='B') ans2++;
if(now[i%4]=='Y') ans3++;
if(now[i%4]=='G') ans4++;
}
}
printf("%d %d %d %d\n",ans1,ans2,ans3,ans4);
}
return;
}
for(int i=1;i<=4;i++)
{
if(!vis[i])
{
vis[i]=1;
b[x]=a[i];
dfs(x+1);
vis[i]=0;
}
}
}
int main()
{
while(cin>>s)
{
dfs(1);
}
}
I - Pythagorean Theorem II CodeForces - 304A
题意:直角三角形满足a ^ 2+b ^ 2 = c ^ 2,在满足1<=a<=b<=c<=n的前提下有多少个不同的直角三角形。
题解:枚举
J - Calendar CodeForces - 304B
题意:给你两个日期,求这两个日期间差多少天。
题解:模拟