POJ答案解析1000——1024,全部AC

谷歌浏览器可以翻译POJ问题全文。

下面代码大都用C++写的,偶尔用C。

1000(A+B问题)

#include <stdio.h>

int main()
{
    int a,b;
    scanf("%d %d",&a, &b);
    printf("%d\n",a+b);
    return 0;
}

1001

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;

char s[10];
int a,n,p_cnt;

struct bign{
    int a[140];
    int p_cnt;
    void set(int a0,int p_cnt0)
    {
        int i;
        p_cnt=p_cnt0;
        for(i=0;a0;i++) {
            a[i]=a0%10;
            a0/=10;
        }
        for(;i<140;i++) a[i]=0;
    }
    struct bign operator *(int b)
    {
        int i,t;
        bign c;
        for(t=i=0;i<140;i++) {
            t=a[i]*b+t;
            c.a[i]=t%10;
            t/=10;
        }
        return c;
    }
    void p()
    {
        int i,j;
        for(i=140-1;i>=p_cnt;i--)
            if(a[i]) break;
        for(j=0;j<p_cnt;j++)
            if(a[j]) break;
        if(i<p_cnt&&j>=p_cnt)
            puts("0");
        else {
            for(;i>=p_cnt;i--)
                printf("%d",a[i]);
            if(j<p_cnt) putchar('.');
            for(i=p_cnt-1;i>=j;i--)
                printf("%d",a[i]);
            printf("\n");
        }
    }
}r,ans;
int init()
{
    if(cin>>s>>n) {
        char *p=strchr(s,'.');
        p_cnt=s+strlen(s)-p-1;
        strcpy(p,p+1);
        sscanf(s,"%d",&a);
        return 1;
    } else {
        return 0;
    }
}
void cal()
{
    int nn=n;
    r.set(a,p_cnt);
    ans.set(1,0);
    while(n--)
        ans=ans*a;
    ans.p_cnt=p_cnt*nn;
}
int main()
{
    while(init()){
        r.set(a,p_cnt);
        cal();
        ans.p();
    }
}

1004(财务管理)

#include <stdio.h>
void main() {
	int i;
	double sum=0,x;
	for(i=0;i<12;i++) {
		scanf("%lf",&x);
		sum=sum+x;
	}
	printf("$%.2lf\n",sum/12);
	
}

1003

# include<stdio.h>
main(){ 
	int i;
	float len,s;

	while(1){
		scanf("%f",&len);
		s = 0.0;
		if(0==len) 
			break;
		for(i = 2; ; i++){
		s+=1.0/i;

		if(s >= len)
			break;
		}
		printf("%d card(s)\n",i-1);
	}
return 0;
}

1002(美国电话号码)

#include <stdio.h>
#include <string.h>
typedef struct
{
        long num[35];
}DATA;
DATA list[100011];
long n;
long cmp(long a[],long b[])
{
     long i;
     for(i=1;i<=7;i++)
     {
      if(a[i]>b[i]) return 1;
      else if(a[i]<b[i]) return -1;
     }
     return 0;
}
void read()
{
     char s[1000];
     long i,j,len,tmp;
     scanf("%ld",&n);
     memset(list[0].num,0,sizeof(list[0].num));
     memset(list[n+1].num,0,sizeof(list[n+1].num));
     for(i=1;i<=n;i++)
     {
      scanf("%s",s+1);
      len=strlen(s+1);
      memset(list[i].num,0,sizeof(list[i].num));
      for(j=1;j<=len;j++)
      {
       if(s[j]=='-') continue;
       list[i].num[0]++;
       if(s[j]=='A'||s[j]=='B'||s[j]=='C') tmp=2;
       if(s[j]=='D'||s[j]=='E'||s[j]=='F') tmp=3;
       if(s[j]=='G'||s[j]=='H'||s[j]=='I') tmp=4;
       if(s[j]=='J'||s[j]=='K'||s[j]=='L') tmp=5;
       if(s[j]=='M'||s[j]=='N'||s[j]=='O') tmp=6;
       if(s[j]=='P'||s[j]=='R'||s[j]=='S') tmp=7;
       if(s[j]=='T'||s[j]=='U'||s[j]=='V') tmp=8;
       if(s[j]=='W'||s[j]=='X'||s[j]=='Y') tmp=9;
       if('0'<=s[j]&&s[j]<='9') tmp=s[j]-'0';
       list[i].num[list[i].num[0]]=tmp;
      }
     }
}
void shift(long x)
{
     long i=x,j=x*2;
     DATA tmp;
     while(j<=n)
     {
      if(j<n) if(cmp(list[j].num,list[j+1].num)==-1) j++;
      if(cmp(list[i].num,list[j].num)==-1)
      {
       tmp=list[i];
       list[i]=list[j];
       list[j]=tmp;
      }
      else break;
      i=j; j*=2;
     }
}
void sort()
{
     long i;
     long kk=n;
     DATA tmp;
     for(i=n/2;i>=1;i--) shift(i);
     for(i=n;i>=1;i--)
     {
       tmp=list[1]; list[1]=list[n]; list[n]=tmp;
       n--;
       shift(1);
     }
     n=kk;
}
void work()
{
     long i,j;
     long ans=0;
     long tmp=1;
     list[0].num[1]=-1;
     list[n+1].num[1]=-1;
     for(i=1;i<=n+1;i++)
     {
       if(cmp(list[i].num,list[i-1].num)==0) tmp++;
       else
       {
         if(tmp>1)
         {
          printf("%ld%ld%ld-%ld%ld%ld%ld %ld\n",
          list[i-1].num[1],list[i-1].num[2],list[i-1].num[3],list[i-1].num[4],
          list[i-1].num[5],list[i-1].num[6],list[i-1].num[7],tmp);
          ans++;
         }
         tmp=1;
       }
     }
     if(ans==0)
      printf("No duplicates.\n");
}
int main()
{
    read();
    sort();
    work();
    return 0;
}

1005(我认为我需要一艘船)

#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
const double PI = 3.14159265;
 
 
int main()
{
    int n;//测试样例个数
    float x, y;//坐标
    int years; //年份
 
    scanf("%d", &n);
 
    for(int i=0; i<n; i++)
    {
        scanf("%f%f", &x, &y);
        printf("Property %d: This property will begin eroding in year %d.\n", i+1, (int)ceil(((x*x+y*y)*PI/2/50)));//注意强制类型转换
      /*  double t = (x*x+y*y)*PI/2/50;
        years = ceil(t);
        printf("Property %d: This property will begin eroding in year %d.\n", i+1, years);*/
    }
     printf("END OF OUTPUT.\n");
 
     return 0;
}

1006(生物节律)

#include <iostream>
using namespace std;
const int lcm=21252;//23,28,33的最小公倍数
int main()
{
    int p,e,i,d,ans,case_i=1;
    while(cin>>p>>e>>i>>d,p!=-1)
    {
        ans=0;
        if(p>=23) p=p-(p/23)*23;
        if(e>=28) e=e-(e/28)*28;
        if(i>=33) i=i-(i/33)*33;
        for(int j=0;;j++)
        {
            ans=j*33+i;
            if(ans%23==p && ans%28==e)
                break;
        }
        if(ans<=d)
        {
            ans+=(d-ans)/lcm*lcm+lcm;
 
        }
        if(ans>d ) ans-=d;
        if(ans>21252) ans=21252;
        cout<<"Case "<<case_i++<<": the next triple peak occurs in "<<ans<<" days."<<endl;
    }
    return 0;
}

1007(DNA)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
typedef struct{
    char seq[50];
    int measure;
} DNA;
 
DNA a[100];
 
int count(char *seq){
   int i,j,cnt=0;
   for(i=0;i<strlen(seq);i++)
       for(j=i+1;j<strlen(seq);j++)
	   if(seq[i]>seq[j])
	       cnt++;
    return cnt;
}
 
int myCompare(const void *ele1,const void *ele2){
    return ((DNA*)ele1)->measure-((DNA*)ele2)->measure;
}
 
int main(void){
    int n,m,i;
    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++){
	scanf("%s",a[i].seq);
	a[i].measure=count(a[i].seq);
    }
    qsort(a,m,sizeof(DNA),myCompare);
    for(i=0;i<m;i++)
       puts(a[i].seq);
    return 0;
}

1008

#include<stdio.h>
#include<string.h>
char p[20][15]={"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen",
                "yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu",
                "uayet"};
char q[20][15]={"imix","ik","akbal","kan","chicchan","cimi","manik","lamat",
                "muluk","ok","chuen","eb","ben","ix","mem","cib","caban",
                "eznab","canac","ahau"};

int get_mnth_ind(char *m)
{
    int i;
    for(i=0;i<19;i++)
        if(strcmp(m,p[i])==0)
            return i;
    return -1;
}
int main()
{
    int n,mnth_day,mnth_ind,year,day;
    char s[15];
    scanf("%d",&n);
    printf("%d\n",n);
    while(n--){
        scanf("%d. %s %d",&mnth_day,s,&year);
        mnth_ind=get_mnth_ind(s);
        day=year*365+mnth_ind*20+mnth_day;
        //printf("day=%d\n",day);
        year=day/260; day%=260;
        mnth_day=day%13+1; mnth_ind=day%20;
        printf("%d %s %d\n",mnth_day,q[mnth_ind],year);
    }
    return 0;
}

1009

//AC
/*上面改了,增加一个起始变化点。同时因为这个点的增加,修改了判断是否点是否合法的判断条件。毕竟原来的判断是基于起始变化点是合法点。
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
    int pos;
    int val;
    void set(int p,int v){pos=p;val=v;}
    bool operator <(node b){return pos<b.pos;}
}a[2005],b[16500];
int width,total,height,pos,acnt,bcnt;
int get_val(int pos)
{
    int i;
    for(i=0;i<acnt;i++)
        if(pos>=a[i].pos&&pos<a[i+1].pos)
            return a[i].val;
}
void cal(int pos)
{
    int r,c,j,k,tpos,val,tval=0;
    val=get_val(pos);
    r=pos/width; c=pos%width;
    for(j=-1;j<=1;j++) {
        if((c+j<0)||(c+j>=width)) continue;
        for(k=-1;k<=1;k++) {
            if((r+k<0)||(r+k>=height)) continue;
            tpos=(r+k)*width+c+j;
            tval=max(tval,abs(val-get_val(tpos)));
        }
    }
    b[bcnt++].set(pos,tval);
}
int main()
{
    int r,c,j,k,i;
    int val,l;
    while(1) {
        scanf("%d",&width);
        if(width==0) break;
        acnt=bcnt=pos=total=0;
        while(1) {
            scanf("%d%d",&val,&l);
            if(val==0&&l==0) break;
            a[acnt++].set(pos,val);
            pos+=l;
        }
        a[acnt++].set(pos,val);//这里修改了
        total=pos; height=total/width;
        for(i=0;i<acnt;i++) {
            r=a[i].pos/width; c=a[i].pos%width;
            for(j=-1;j<=1;j++) {
                if((c+j<0)||(c+j>=width)) continue;
                for(k=-1;k<=1;k++) {
                    if((r+k<0)||(r+k>=height)) continue;
                    cal((r+k)*width+c+j);
                }
            }
        }
        b[bcnt].set(total,-1);
        sort(b,b+bcnt);
        printf("%d\n",width);
        pos=0;
        for(i=0;i<bcnt;i=j) {
            for(j=i+1;j<bcnt;j++)
                if(b[j].val!=b[i].val) break;
            printf("%d %d\n",b[i].val,b[j].pos-b[i].pos);
        }
        printf("0 0\n");
    }
    printf("0\n");
    return 0;
}

1010

#include<iostream>
#include<cmath>
#include<algorithm>
#include <stdio.h>
#include <string.h>
 
#define MAX_Count 111
 
int main(void)
{
	int k = 0;
	int count_type[MAX_Count]={0};
    int stamp_type[MAX_Count];
    int out[4];
    int stamp_quest, stamp_type_num;
    int st;
    int Tie_sum = 1;
 
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	while(scanf("%d", &st) != EOF)
	{
        int max_num = -1;
	    for (int i = 0;i < MAX_Count;i ++) count_type[i] = 0;
		if (st > max_num)
            max_num = st;
		count_type[st]++;//for first input
 
		while(scanf("%d", &st) && st)
		{
		    if (st > max_num)
                max_num = st;
			if (count_type[st] < 5)	//for other
                count_type[st] ++;
		}
		for (int i = 0;i <= max_num;i ++){
            while(count_type[i]--){
                stamp_type[k++] = i;
            }
		}
		stamp_type[k++] = 0;
		stamp_type_num = k;k = 0;
//		for (int i = 0;i < stamp_type_num;i ++){
//            printf("%d ", stamp_type[i]);
//		}
//		printf("\n");
 
		while(scanf("%d", &stamp_quest) && stamp_quest)
		{
			int type_sum = -1;
			int num_sum = -1;
			int max_sum = -1;
			for (int i = 0;i < stamp_type_num;i ++)
				for (int j = i;j < stamp_type_num;j ++)
					for (int k = j;k < stamp_type_num;k ++)
						for (int p = k;p < stamp_type_num;p ++)
						{
							if (stamp_type[i] + stamp_type[j] + stamp_type[k] + stamp_type[p] != stamp_quest) continue;
//                            printf("%d %d %d %d\n", stamp_type[i], stamp_type[j], stamp_type[k], stamp_type[p]);
							int qus_one = 0;
							int qus_two = 0;
							int max_stamp = 0;
 
                            if (stamp_type[i]){qus_one++; qus_two++; if (stamp_type[i] > max_stamp) max_stamp = stamp_type[i];}
							if (stamp_type[j]){qus_one++; if(j > i) qus_two++; if (stamp_type[j] > max_stamp) max_stamp = stamp_type[j];}
							if (stamp_type[k]){qus_one++; if(k > j) qus_two++; if (stamp_type[k] > max_stamp) max_stamp = stamp_type[k];}
							if (stamp_type[p]){qus_one++; if(p > k) qus_two++; if (stamp_type[p] > max_stamp) max_stamp = stamp_type[p];}
 
							if (type_sum < qus_two)
							{
								type_sum = qus_two;
								num_sum = qus_one;
								max_sum = max_stamp;
								out[0] = i;out[1] = j; out[2] = k; out[3] = p;
								Tie_sum = 0;
								continue;
							}else if (type_sum > qus_two) continue;
 
							if (num_sum > qus_one)
							{
								type_sum =qus_two;
								num_sum = qus_one;
								max_sum = max_stamp;
								out[0] = i;out[1] = j; out[2] = k; out[3] = p;
								Tie_sum = 0;
								continue;
							}else if (num_sum < qus_one) continue;
 
							if (max_sum < max_stamp)
							{
								type_sum = qus_two;
								num_sum = qus_one;
								max_sum = max_stamp;
								out[0] = i; out[1] = j; out[2] = k; out[3] = p;
								Tie_sum = 0;
								continue;
							}else if (max_sum > max_stamp) continue;
							Tie_sum = 1;
						}
			if (type_sum == -1){
				printf("%d ---- none\n", stamp_quest);
                continue;
			}
			printf("%d (%d):", stamp_quest, type_sum);
			if (Tie_sum){
				printf(" tie\n");
				continue;
			}
			for (int i = 0;i < 4;i ++)
				if (stamp_type[out[i]] > 0) printf(" %d", stamp_type[out[i]]);
			printf("\n");
		}
 
	}
}

1011

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 100
using namespace std;
 
int n,Mlen,a[M],mark[M];
 
int cmp(int a,int b){
	return a>b;
}
 
int dfs(int N,int now){
	int i,j;
	if(N==0 && now==0){
		return 1;
	}
	if(now==0){
		now=Mlen;
	}
	for(i=0;i<n;i++){
		if(!mark[i] && a[i]<=now){
			if(i>0){
				if(!mark[i-1] && a[i-1]==a[i]) continue;//对于相等的就可以省去搜索
			}	
			mark[i]=1;
			if(dfs(N-1,now-a[i]))return 1;//dfs的还原。。。
			else {
				mark[i]=0;
				if(a[i]==now || now==Mlen) return 0;
			}
		}
	}
	return 0;
}
 
int main(){
	int i,j,sum;
	while(scanf("%d",&n),n){
		sum=0;
		for(i=0;i<n;i++){
			scanf("%d",&a[i]);
			sum+=a[i];
		}
		sort(a,a+n,cmp);
		for(i=a[0];i<=sum/2;i++){
			if(sum%i==0){
				for(j=0;j<n;j++){
					mark[j]=0;
				}
				Mlen=i;
				if(dfs(n,Mlen)){
					printf("%d\n",Mlen);
					break;
				}
			}			
		}
		if(i>sum/2)printf("%d\n",sum);
	}
	return 0;
} 

1012

/*
poj 1012 Joseph
题意:约瑟夫问题,要求后k个数比前k个数先删除,求最小的m。
题解:暴力。。。
k不多,把答案存下,就不会超时。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
 
int n;
int a[N];
int main()
{
    int k;
    while(cin >> k && k)
    {
        if(a[k])
        {
            printf("%d\n",a[k]);
            continue;
        }
        n = k*2;
        int m;
        for(m = k+1; ; m++)
        {
            int i;
            int s = 0;
            for(i = 0; i < k; i++)
            {
                s = (s+m-1)%(n-i);
                if(s < k)
                    break;
            }
            if(i == k)
                break;
        }
        a[k] = m;
        printf("%d\n",m);
    }
    return 0;
}

1013

#include<iostream>
#include<cstring>
#include<cmath>

using namespace std;

const int silver = 2147483647;
int maximum = -2147483647;
int position;
int main()
{
	int time = 3;
	int coin[12];
	char status[5];
	int test;
	cin >> test;
	while(--test+1)
	{
		memset(coin,0,sizeof(coin));
		maximum = -2147483647;
		time = 3;
		while(--time+1)
		{
			char c1[7],c2[7];
			cin >> c1 >> c2 >> status;
			
			if(status[0] == 'e')
			{
				for(int i = 0;i < strlen(c1); ++i)
				{
				coin[c1[i] - 'A'] = silver;
				coin[c2[i] - 'A'] = silver;
				}
			}
			if(status[0] == 'u')
			{
				for(int i = 0; i < strlen(c1); ++i)
				{
					if(coin[c1[i] - 'A'] != silver)
						coin[c1[i] - 'A'] += 1;
					if(coin[c2[i] - 'A'] != silver)
						coin[c2[i] - 'A'] -= 1;
				}
			}
			if(status[0] == 'd')
			{
				for(int i = 0; i < strlen(c1); ++i)
				{
					if(coin[c1[i] - 'A'] != silver)
						coin[c1[i] - 'A'] -= 1;
					if(coin[c2[i] - 'A'] != silver)
						coin[c2[i] - 'A'] += 1;
				}
			}
		}
			for(int i = 0;i < 12;++i)
			{
				if(coin[i] == silver) continue;
				if(abs(coin[i]) > maximum)
				{
					maximum = abs(coin[i]);
					position = i;
				}
			}
			if(coin[position] < 0)
				cout << static_cast<char>( position + 'A') << " is the counterfeit coin and it is light."<<endl;
			if(coin[position] > 0)
				cout << static_cast<char>( position + 'A') << " is the counterfeit coin and it is heavy."<<endl;
	}
	return 0;
}

1014

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
 
int dp[100000];
 
int main()
{
    int a[11],sum,v,i,j,k,cnt,cas = 1;
    while(~scanf("%d",&a[1]))
    {
        sum = a[1];
        for(i = 2;i<=6;i++)
        {
            scanf("%d",&a[i]);
            sum+=i*a[i];
        }
        if(!sum)
        break;
        printf("Collection #%d:\n",cas++);
        if(sum%2)//总和为奇数,必定不能平分
        {
            printf("Can't be divided.\n\n");
            continue;
        }
        v = sum/2;
        memset(dp,0,sizeof(dp));
        dp[0] = 1;
        for(i = 1;i<=6;i++)
        {
            if(!a[i])
            continue;
            for(j = 1;j<=a[i];j*=2)//二进制优化
            {
                cnt = j*i;
                for(k = v;k>=cnt;k--)
                {
                    if(dp[k-cnt])//必须前面的能够放入背包,现在的才能放入背包
                    dp[k] = 1;
                }
                a[i]-=j;
            }
            cnt = a[i]*i;//剩下的
            if(cnt)
            {
                for(k = v;k>=cnt;k--)
                {
                    if(dp[k-cnt])
                    dp[k] = 1;
                }
            }
        }
        if(dp[v])
        printf("Can be divided.\n\n");
        else
        printf("Can't be divided.\n\n");
    }
 
    return 0;
}

1015

#include <iostream>
using namespace std;

int p[201],d[201],result[21];
int dp[21][801],path[21][801];

int cmp(const void *a,const void *b){
    return *(int *)a-*(int *)b;
}
bool select(int a,int b,int i){
    while(a>0 && path[a][b]!=i){
        b-=p[path[a][b]]-d[path[a][b]];
        a--;
    }
    return (a!=0)?true:false;
}
int main(){
    int i,j,k,a,b,n,m,origin,ca=1;
    while(scanf("%d %d",&n,&m),n||m){
        for(i=1;i<=n;i++)
            scanf("%d %d",p+i,d+i);
        memset(dp,-1,sizeof(dp));
        memset(path,0,sizeof(path));
        origin=m*20;
        for(dp[0][origin]=j=0;j<m;j++)
            for(k=0;k<=origin*2;k++)
                if(dp[j][k]>=0){
                    for(i=1;i<=n;i++)
                        if(dp[j+1][k+p[i]-d[i]]<dp[j][k]+p[i]+d[i]){
                            a=j,b=k;
                            if(!select(a,b,i)){
                                dp[j+1][k+p[i]-d[i]]=dp[j][k]+p[i]+d[i];
                                path[j+1][k+p[i]-d[i]]=i;
                            }
                        }
                }
        for(i=origin,j=0;dp[m][i+j]<0 && dp[m][i-j]<0;j++);
        k=dp[m][i+j]>dp[m][i-j]?i+j:i-j;
        printf("Jury #%d\n",ca++);
        printf("Best jury has value %d for prosecution and value %d for defence:\n",(dp[m][k]+k-origin)/2, (dp[m][k]-k+origin)/2);
        for(i=1;i<=m;i++){
            result[i]=path[m-i+1][k];
            k-=p[result[i]]-d[result[i]];
        }
        qsort(result+1,m,sizeof(int),cmp);
        for(i=1;i<=m;i++)
            printf(" %d",result[i]);
        printf("\n");
        printf("\n");
    }
    return 0;
}

1016

#include <stdio.h>
#include <string.h>
 
#ifndef bool
	#define bool int
	#define false ((bool)0)
	#define true ((bool)1)
#endif
 
char *selfInventory = " is self-inventorying";
char *enterInventory = " enters an inventory loop of length ";
char *after = " after ";
char *steps = " steps";
char *notClassified = " can not be classified after 15 iterations";
 
#define MaxLoop 15
 
char digits[MaxLoop][81];
int num[10];
 
void countEachNum(char digit[])
{
	int i;
	for(i=0;i<10;i++)num[i]=0;
 
	for(i=0;i<digit[0];i++)
	{
		num[digit[i+1]]++;
	}
	return;
}
 
void copyNumToDigits(char digit[])
{
	int i,j;
	for(i=0,j=1;i<10;i++)
	{
		if(num[i]==0)continue;
		if(num[i]<10)
		{
			digit[j] = num[i];
			digit[j+1] = i;
			j = j+2;
		}
		else
		{
			digit[j] = num[i]/10;
			digit[j+1] = num[i]%10;
			digit[j+2] = i;
			j = j+3;
		}
	}
	digit[0]=j-1;
	return;
}
 
int compareDigits(int loop)
{
	int i,j;
	bool isInventory;
	int length = digits[loop][0];
	for(i=loop-1;i>=0;i--)
	{
		isInventory = true;
		if(length!=digits[i][0]) continue;
		for(j=1;j<length+1;j++)
		{
			if(digits[loop][j]!=digits[i][j]){isInventory = false; break;}
		}
		if(isInventory == true)return i;
	}
	return -1;
}
 
int main()
{
 
	char input[82];
	int i,res,length,loop;
	bool inventory;
	while(1)
	{
		fgets(input,82,stdin);			//stdin
		if(input[0]=='-') return 0;
		res = 0;
		
		length = strlen(input);
		input[length-1] = '\0';		//除去读取到的回车符
		digits[0][0] = length-1;
		for(i=0;i<length-1;i++)digits[0][i+1]=input[i]-'0';
	
		for(loop=0;loop<MaxLoop;loop++)
		{
			inventory = true;
			countEachNum(digits[loop]);
			copyNumToDigits(digits[loop+1]);
			res = compareDigits(loop+1);
			if(res == -1){inventory = false; continue;}
			if(loop == res)
			{
				if(loop == 0)printf("%s%s\n",input,selfInventory);
				else printf("%s%s%s%d%s\n",input,selfInventory,after,loop,steps);		//after loop
				break;
			}//self-inventorying
			else
			{
				printf("%s%s%d\n",input,enterInventory,loop+1-res);		//loop-res
				break;
			}
		}
		if(inventory == false)	printf("%s%s\n",input,notClassified);
	}
	return 0;
}

1017

#include<stdio.h>
int main()
{
    int a1,a2,a3,a4,a5,a6;
    int res,res1,res2,sum;
    while(scanf("%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6))
    {
        if(a1+a2+a3+a4+a5+a6==0)
            break;
        sum=0;
        if(a6>0)
            sum+=a6;
        if(a5>0)
        {
            sum+=a5;
            res=a5*11;
            if(res>a1)
                a1=0;
            else
                a1-=res;
        }
        if(a4>0)
        {
            sum+=a4;
            res2=5*a4;
            res1=0;
            if(a2<res2)
            {
                res1=(res2-a2)*4;
                a2=0;
            }
            else
            {
                a2-=res2;
                res1=0;
            }
            if(res1>0&&a1>0)
            {
                if(a1<res1)
                    a1=0;
                else
                    a1-=res1;
            }
        }
        if(a3>0)
        {
            if(a3>=4)
            {
              sum+=a3/4;
              if(a3%4!=0)
                  sum++;
            }
            else
                sum++;
            res1=res2=0;///***
            if(a3%4!=0)
            {
                res=a3%4;
                res2=5-(res-1)*2;
                res1=8-res;
                if(a2>0)
                {
                    if(a2<res2)
                    {
                        res1+=(res2-a2)*4;//
                        a2=0;
                    }
                    else
                    {
                        a2-=res2;
                    }
                }
                if(a1>0)
                {
                    if(a1<res1)
                    {
                        a1=0;
                    }
                    else
                    {
                        a1-=res1;
                    }
                }
            }
        }
        if(a2>0)
        {
            if(a2>=9)
            {
                sum+=a2/9;
                if(a2%9!=0)
                    sum++;
            }
            else
                sum++;
            res=a2%9;
            if(res>0)
            {
                res1=(9-res)*4;
                if(a1>0)
                {
                    if(a1<res1)
                        a1=0;
                    else
                        a1-=res1;
                }
            }
        }
        if(a1>0)
        {
            if(a1>=36)
            {
                sum+=a1/36;
                if(a1%36!=0)
                    sum++;
            }
            else
                sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}

1018

#include<iostream>
using namespace std;
int a[200],b[150][150][2];
int main()
{
    int ii,min,max,mat,t,i,j,n,tot,k;
    double tp;
    scanf("%d",&t);
    for(ii=1;ii<=t;ii++)
    {
        scanf("%d",&n);
        min=100000000;
        max=100000000;   
        for(i=1;i<=n;i++)
        {
            mat=0;
            scanf("%d",&a[i]);
            for(j=1;j<=a[i];j++)
            {
                scanf("%d%d",&b[i][j][0],&b[i][j][1]);
                if (b[i][j][0]<min) min=b[i][j][0];
                if (b[i][j][0]>mat) mat=b[i][j][0];
            }
            if (max>mat) max=mat;
        }
        tp=0;
        for(i=min;i<=max;i++)
        {
            tot=0;
            for(j=1;j<=n;j++)
            {
                //d=false;
                mat=100000000;
                for(k=1;k<=a[j];k++)
                    if (b[j][k][0]>=i&&b[j][k][1]<mat)
                    {
                        mat=b[j][k][1];
                    }
                 //if (mat==100000000) break;
                 tot=tot+mat;
                }
               if (i/(tot+0.0)>tp) tp=i/(tot+0.0);
        }
        printf("%.3lf\n",tp);
    }
    return 0;
}    

1019

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=31270+1;
const __int64 inf=2147483647;
__int64 a[maxn],cnt,sum[maxn],d[maxn];
__int64 digit(__int64 n)
{
    __int64 cnt=0;
    while(n) cnt++,n/=10;
    return cnt;
}
// 1  2  3  4  5  6  7  8  9
int binarySearch(__int64 a[],int n,__int64 key)//第一个>=key的数的位置
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(a[mid]>=key) r=mid;
        else l=mid+1;
    }
    return l;
}

int main()
{
    for(int i=1;i<maxn;i++)
    {
        int dit=digit(i);
        a[i]=a[i-1]+dit;
        sum[i]=sum[i-1]+a[i];
    }
    int ci;scanf("%d",&ci);
    while(ci--)
    {
        __int64 n;scanf("%I64d",&n);
        int p;
        p=binarySearch(sum,maxn,n);
        int pos=n-sum[p-1];
        int l=binarySearch(a,maxn,pos);
        int k=pos-a[l-1];
        string str;
        while(l) str+=l%10+'0',l/=10;
        reverse(str.begin(),str.end());
        cout<<str[k-1]<<endl;
    }
    return 0;
}

1020

#include<iostream>
#include<stdio.h>
#include<string.h>
int cakesize;
int number;
int cake[11],cols[41];
bool cutcake(int a)
{
    int selectcol;
    int minrow;
    int i,j;
    bool isok;
  if(a==number)return true;
  minrow=41;
  for(i=1;i<=cakesize;i++)
  {
      if(cols[i]<minrow)
      {
          selectcol=i;
          minrow=cols[selectcol];
      }
  }
  for( i=10;i>0;i--)
  {
      if(cake[i]>0&&(selectcol+i-1)<=cakesize&&(minrow+i-1)<=cakesize)
      {
          isok=true;
          for( j=selectcol;j<selectcol+i;j++)
          {
              if(cols[j]>minrow)
              {isok=false;
              break;
              }
          }
          if(isok==true)
          {
              for( j=selectcol;j<selectcol+i;j++)
              {
                  cols[j]+=i;
              }
              cake[i]--;
              if(cutcake(a+1)==true)
              {
                  return true;
              }
              else
              {
                  for(j=selectcol;j<selectcol+i;j++)
                  {
                      cols[j]-=i;
                  }
                  cake[i]++;
              }
          }
      }
  }
  return false;
}
int main()
{
    int temp;
    int test=0;
    scanf("%d",&test);
    int i;
    while(test--)
    {
        memset(cake,0,sizeof(cake));
        scanf("%d %d",&cakesize,&number);
        int sum=0;
        for(i=0;i<number;i++)
        {
            scanf("%d",&temp);
            cake[temp]++;
            sum+=temp*temp;
        }
        if(sum!=cakesize*cakesize)
        {
            printf("HUTUTU!\n");
        }
        else
        {
            for( i=1;i<=40;i++)
            cols[i]=1;
        bool flage=false;
        flage=cutcake(0);
        if(flage==true)
        {
           printf("KHOOOOB!\n");
        }
        else
       printf("HUTUTU!\n");
    }
    }
    return 0;
}

1021

#include <iostream>

using namespace std;

bool map[101][101];
int W, H, n;

struct dot
{
    int x, y;
}dots[100010];

int dot1[10000], dot2[10000];

void quicksort(int left, int right, int *dotx)
{
    int i, j, temp;
    if (left < right)
    {
        i = left, j = right, temp = dotx[left];
        while (i < j)
        {
            while (i < j&&dotx[j] >= temp) j--;
            dotx[i] = dotx[j];
            while (i < j&&dotx[i] <= temp) i++;
            dotx[j] = dotx[i];
        }
        dotx[i] = temp;
        quicksort(left, j - 1, dotx);
        quicksort(j + 1, right, dotx);
    }
}

void Count(int *dot, int i)
{
    int x, y, sum;
    sum = 0;
    x = dots[i].x;
    y = dots[i].y;
    y--;
    while (map[x][y] && y >= 0)         //统计左边点的个数
    {
        sum++;
        y--;
    }
    y = dots[i].y;
    y++;
    while (map[x][y] && y < H)         //统计右边点的个数
    {
        sum++;
        y++;
    }
    y = dots[i].y;
    x--;
    while (map[x][y] && x >= 0)         //统计下面点的个数
    {
        sum++;
        x--;
    }
    x = dots[i].x;
    x++;
    while (map[x][y] && x < W)         //统计上面点的个数
    {
        sum++;
        x++;
    }
    dot[i] = sum;
}

int main()
{
    int t;
    cin >> t;
    int sum1, sum2;
    while (t--)
    {
        sum1 = sum2 = 0;
        memset(map, false, sizeof(map));
        cin >> W >> H >> n;
        for (int i = 1; i <= n; i++)          //输入第一组点
        {
            cin >> dots[i].x >> dots[i].y;
            map[dots[i].x][dots[i].y] = true;
        }
        for (int i = 1; i <= n; i++)
            Count(dot1, i), sum1 += dot1[i];                   //第一张图的连续点数
        memset(map, false, sizeof(map));
        for (int i = 1; i <= n; i++)          //输入第二组点
        {
            cin >> dots[i].x >> dots[i].y;
            map[dots[i].x][dots[i].y] = true;
        }
        for (int i = 1; i <= n; i++)
            Count(dot2, i), sum2 += dot2[i];                   //第二张图的连续点数
        if (sum1 != sum2) cout << "NO" << endl;
        else
        {
            quicksort(1, n, dot1);
            quicksort(1, n, dot2);
            int flag = 1;
            for (int i = 1; i <= n; i++)
            {
                if (dot1[i] != dot2[i])
                {
                                        //我之前在这里写了输出用来看数据的
                                        //我提交的时候忘记删了,结果还对了
                                        //不得不说这测试数据是真的水
                    flag = 0;
                    break;
                }
            }
            if (flag) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
}

1022

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
 
int flag,t,cnt,vis[105],a[105][8],sum1,sum2,sum3,sum4,pre;
map<int,int> mp1;//从编号到下标的映射(这个是看到网上别人用了map就用了==本来没想到这个的)
map<int,int> mp2;//从下标到编号的映射
 
void dfs(int i)
{
    int j;
    if(flag)return;
    if(vis[i])return;
    if(t!=8&&a[i][t]!=pre){flag=1;return;}
    vis[i]=1;
    cnt++;
    for(j=0;j<8;j++)
    {
        if(flag)break;
        if(a[i][j]!=0)
        {
            if(j%2==0)t=j+1;
            else t=j-1;
            if(j==1||j==0)sum1++;//统计面数
            else if(j==2||j==3)sum2++;
            else if(j==4||j==5)sum3++;
            else if(j==6||j==7)sum4++;
            pre=mp2[i];
            dfs(mp1[a[i][j]]);
        }
    }
}
 
int main()
{
    int T,n,p,num,q;
    scanf("%d",&T);
    while(T--)
    {
        sum1=sum2=sum3=sum4=0;
        flag=0;
        t=8;
        cnt=0;//这个地方和下面一行当初没更新==WA了。。以后调试的时候如果有输入多组数据可以试着把同一组数据输两次看看结果一不一样
        memset(vis,0,sizeof(vis));
        scanf("%d",&n);
        for(p=0;p<n;p++)
        {
            scanf("%d",&num);
            mp1[num]=p;
            mp2[p]=num;
            for(q=0;q<8;q++)scanf("%d",&a[p][q]);
        }
        dfs(0);
        if(flag||cnt<n)printf("Inconsistent\n");
        else printf("%d\n",(sum1/2+1)*(sum2/2+1)*(sum3/2+1)*(sum4/2+1));
    }
    return 0;
}

1023

#include<iostream>
#include<string>
using namespace std;
int main() {
    int t,k;
   
    cin>>t;
    while(t--){ 
        __int64 n;
        string str;
        cin>>k>>str>>n;
        int j=0;
        int *p=new int[k];
        for(int i=k-1;i>=0;i--){
            if(n%2==1||n%2==-1){
                if(str[i]=='p')n=(n-1)/2;
                else n=(n+1)/2;
                p[j++]=1;
            }
            else {
                n/=2;
                p[j++]=0;
            }
        }
        if(n)cout<<"Impossible"<<endl;
        else {
            for(int i=j-1;i>=0;i--)cout<<p[i];
            cout<<endl;
        }
        delete []p;
    }
    //system("pause");
    return 0;
}

1024

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;      
}
int T;
int N,M;
char str[100001];
bool path[101][101];
bool to[101][101][4];//0:up 1:do 2:lf 3:rt
int toed[101][101];
int tobg[101][101];
bool vis[101][101];
int stx,sty;
int W;
int a1[1001],b1[1001],c1[1001],d1[1001];
 
struct data{
    int x,y,st;
}Que[100001];
int dis[5][2]={{1,0},{0,1},{-1,0},{0,-1}};
 
void BFS(bool k){
    int l=1,r=1;
    Que[l].x=stx,Que[l].y=sty;
    vis[stx][sty]=true;
    while(l<=r){
        int a=Que[l].x,b=Que[l].y;
        //cout<<a<<" "<<b<<":"<<Que[l].st<<endl;
        for(int i=0;i<4;i++){
            //cout<<to[a][b][i]<<endl;
            if(to[a][b][i]){continue;}
            int xx=a+dis[i][0];
            int yy=b+dis[i][1];
            if(xx<0||yy<0||xx>N-1||yy>M-1||vis[xx][yy]) continue;
            vis[xx][yy]=true;
            if(k==0)toed[xx][yy]=Que[l].st+1;
            else tobg[xx][yy]=Que[l].st+1;
            Que[++r].st=Que[l].st+1;
            Que[r].x=xx,Que[r].y=yy;
        }
        l++;
    }
    return ;
}
 
int main(){
    T=read();
    while(T--){
       N=read(),M=read();
       cin>>str;int len=strlen(str);
       memset(to,0,sizeof(to));
       memset(path,0,sizeof(path));
       memset(toed,0,sizeof(toed));
       memset(tobg,0,sizeof(tobg));
       for(int i=0;i<N;i++) 
            to[i][0][3]=to[i][M-1][1]=1; 
        for(int i=0;i<M;i++) 
            to[0][i][2]=to[N-1][i][0]=1; 
       stx=0,sty=0;
       path[stx][sty]=true;
       for(int i=0;i<len;i++){
           if(str[i]=='R') stx++;
           if(str[i]=='L') stx--;
           if(str[i]=='D') sty--;
           if(str[i]=='U') sty++;
           path[stx][sty]=true;
       }
       W=read();
       for(int i=1;i<=W;i++){
           int a=read(),b=read(),c=read(),d=read();
           if(b<d){
               to[a][b][1]=true;
               to[c][d][3]=true;
           }
           if(b>d){
               to[a][b][3]=true;
               to[c][d][1]=true;
           }
           if(a<c){
               to[a][b][0]=true;
               to[c][d][2]=true;
           }
           if(a>c){
               to[a][b][2]=true;
               to[c][d][0]=true;
           }
           a1[i]=a,b1[i]=b,c1[i]=c,d1[i]=d;
       }
       memset(vis,0,sizeof(vis));
       BFS(0);
       memset(vis,0,sizeof(vis));
       stx=0,sty=0;
       BFS(1);
       bool flag=false;
       for(int i=0;i<N;i++){
           for(int j=0;j<M;j++){
               if(!path[i][j]){
                   if(tobg[i][j]+toed[i][j]<=len){
                       flag=true;
                       //break;
                   }   
               }
               //if(!path[i][j])cout<<i<<" "<<j<<":"<<tobg[i][j]<<" "<<toed[i][j]<<endl;
           }
           //if(flag) break;
       }
       if(flag){
           puts("INCORRECT");
           continue;    
       }
       for(int i=1;i<=W;i++){
           if((tobg[a1[i]][b1[i]]+toed[c1[i]][d1[i]]>len)&&(tobg[c1[i]][d1[i]]+toed[a1[i]][b1[i]]>len))       
               {flag=true;break;}
       }
       if(flag){
           puts("INCORRECT");
           continue;   
       }
       puts("CORRECT");
    }
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Linux系统开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值