@[toc]灵动ICPC冬令营基础-1
A - Specialized Four-Digit Numbers
#include<stdio.h>
int Calc(int base , int n){
int m=0;
while(n){
m = m + n % base;
n /= base;
}
return m;
}
int main(){
int i;
for(i=1000;i<10000;i++){
if(Calc(10,i)==Calc(16,i)&&Calc(10,i)==Calc(12,i)) printf("%d\n",i);
}
return 0;
}
直接把n进制每一位的值计算到和里
B - Pig-Latin
#include<stdio.h>
char s[1000005];
int isab(char c){
if(c>='a'&&c<='z') return 1;
if(c>='A'&&c<='Z') return 1;
return 0;
}
int vowel(char c){
if(c=='a'||c=='A') return 1;
if(c=='e'||c=='E') return 1;
if(c=='i'||c=='I') return 1;
if(c=='o'||c=='O') return 1;
if(c=='u'||c=='U') return 1;
return 0;
}
int main(){
int i,j,k,count=0;
while(gets(s)){
i=0,j=0;
while(s[i]){
if(!isab(s[i])){
printf("%c",s[i++]);
j=i;
}
else if(isab(s[j])){
j++;
}
else{
if(vowel(s[i])) for(k=i;k<j;k++) printf("%c",s[k]);
else {
for(k=i+1;k<j;k++) printf("%c",s[k]);
printf("%c",s[i]);
}
printf("ay");
i=j;
}
}
}
return 0;
}
按要求,最后在单词后输出ay
C - Tic Tac Toe
#include <stdio.h>
char a[4][4];
int i, j;
int win(char c) {
for(i=0;i<3;i++) {
for(j=0;j<3&&a[i][j]==c;j++)
if(j==2) return 1;
for(j=0;j<3&&a[j][i]==c;j++)
if(j==2) return 1;
}
for(i=0;i<3&&a[i][i]==c;i++)
if(i==2) return 1;
for(i=0;i<3&&a[i][2-i]==c;i++)
if(i==2) return 1;
return 0;
}
int main() {
int n, o, x, t;
scanf("%d",&n);
while(n--){
t=1;
x=o=0;
for(i=0;i<3;i++){
scanf("%s",a[i]);
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]=='X') ++x;
else if(a[i][j]=='O') ++o;
}
}
if(x<o) t=0;
if(x>=(o+2)) t=0;
if(win('X')&&win('O')) t=0;
if(win('O')&&o!=x) t=0;
if(win('X')&&o==x) t=0;
if(t==1) printf("yes\n");
else printf("no\n");
}
return 0;
}
判断不符合条件的
D - Factorial! You Must be Kidding!!!
#include<stdio.h>
const int N = 13;
long long F[N+1];
void init() {
F[0]=1;
int i;
for(i=1;i<=N;i++){
F[i]=i*F[i-1];
}
}
int main(){
int n;
init();
while(~scanf("%d",&n)){
if(n>13||(n<0&&(-n)%2==1)) printf("Overflow!\n");
else if(F[n]<10000||(n<0&&(-n)%2==0)) printf("Underflow!\n");
else printf("%lld\n",F[n]);
}
return 0;
}
E - Function Run Fun
#include<stdio.h>
#include<string.h>
#define N 20
int f[N+1][N+1][N+1];
int w(int a,int b, int c){
if(a<=0||b<=0||c<=0) return 1;
else if(a>N||b>N||c>N) return w(N,N,N);
else if(f[a][b][c]) return f[a][b][c];
else if(a<b&&b<c) return f[a][b][c] =w(a,b,c-1)+ w(a,b-1,c-1)- w(a,b-1,c);
else return f[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c) + w(a-1,b,c-1)- w(a-1,b-1,c-1);
}
int main(){
int a,b,c;
while(scanf("%d %d %d",&a,&b,&c)!=EOF){
if(a==-1&&b==-1&&c==-1) return 0;
printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
}
return 0;
}
因为算的很多,所以要一个数组来记忆递归结果
F - Simple Addition
#include<stdio.h>
long long sum;
long long F(long long n){
if(n%10>0) return n%10;
else if(n==0) return 0;
else return F(n/10);
}
void E(long long p,long long q){
int i;
if((q-p)<9){
for(i=p;i<=q;i++){
sum+=i;
}
printf("%lld\n",sum);
return;
}
while(p%10){
sum+=F(p);
p++;
}
while(q%10){
sum+=F(q);
q--;
}
sum=sum+(q/10-p/10)*45;
E(p/10,q/10);
}
int main (){
long long p,q;
while(scanf("%lld%lld",&p,&q)!=EOF){
if(p<0&&q<0) return 0;
E(p,q);
sum=0;
}
return 0;
}
分类分别求个位数 用递归把个位是0的数的十位变成个位
G - A Contesting Decision
#include<stdio.h>
#include<string.h>
#define maxn 30
#define maxs 1000
struct team_info{
char Name[maxn];
int p1Sub;
int p1Time;
int p2Sub;
int p2Time;
int p3Sub;
int p3Time;
int p4Sub;
int p4Time;
int num;
int time;
}team[maxs];
int main (){
int n,i;
char wname[20];
int wsol , wpt ;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s%d%d%d%d%d%d%d%d",team[i].Name,&team[i].p1Sub,&team[i].p1Time,&team[i].p2Sub,&team[i].p2Time,&team[i].p3Sub,&team[i].p3Time,&team[i].p4Sub,&team[i].p4Time);
if(team[i].p1Time!=0) team[i].num=team[i].num+1,team[i].time=team[i].time+team[i].p1Time+(team[i].p1Sub-1)*20;
if(team[i].p2Time!=0) team[i].num=team[i].num+1,team[i].time=team[i].time+team[i].p2Time+(team[i].p2Sub-1)*20;
if(team[i].p3Time!=0) team[i].num=team[i].num+1,team[i].time=team[i].time+team[i].p3Time+(team[i].p3Sub-1)*20;
if(team[i].p4Time!=0) team[i].num=team[i].num+1,team[i].time=team[i].time+team[i].p4Time+(team[i].p4Sub-1)*20;
}
strcpy(wname,team[0].Name);
wsol=team[0].num;
wpt=team[0].time;
for(i=0;i<n;i++){
if((team[i].num>wsol) || (team[i].num==wsol && team[i].time<wpt)){
wsol=team[i].num;
strcpy(wname,team[i].Name);
wpt=team[i].time;
}
}
printf("%s %d %d",wname,wsol,wpt);
return 0;
}