zoj 1622 &&zoj 1949 && zoj 2679 (水~~)

zoj 1622 

题意:

求最少改变几盏灯能使N盏灯亮暗相间。

分析:

我的方法是只要确定第一盏灯的情况就可以了。当我看到学长霸气的代码时,我输了。min=sum(奇开,偶关)<sum(奇关,偶开)?sum1:sum2;

#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue> 
#include <set>
#include <map>
#include <algorithm>
using  namespace  std;

int main ()
{
	int N,a[10005],b[10005];
	int i,turn1,least,turn2;
	while(~scanf("%d",&N))
	{
		turn1=0;
		turn2=0;
		for(i=0;i<N;i++)
		{
			cin>>a[i];
			b[i]=a[i];
		}
		if(a[0]==1) turn1++;
		if(a[0]==0) turn2++;
		a[0]=0;
		for(i=1;i<N;i++)
		{
			if(a[i]==a[i-1]) 
			{
				turn1++;
				if(a[i-1]==0)
					a[i]=1;
				else 
					a[i]=0;
			}
		}
		b[0]=1;
		for(i=1;i<N;i++)
		{
			if(b[i]==b[i-1])
			{
				turn2++;
				if(b[i-1]==0) 
					b[i]=1;
				else 
					b[i]=0;
			}
		}
		least=turn1<turn2?turn1:turn2;
		cout<<least<<endl;
	}
	return 0;
}

/*9 1  1 0 1 0 1 0 1 0*/

//学长的方法:
//将奇数位置上开着的和偶数位置上关着的相加。与相反的情况比较。
#include<stdio.h>
int main()
{
	int n,a[10005],k,m,i;
	while(scanf("%d",&n)!=EOF)
	{
		m=0;
		k=0;
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		for(i=0;i<n;i=i+2)
		{
			if(a[i]==0)
				k++;
			else
				m++;
		}
		for(i=1;i<n;i=i+2)
		{
			if(a[i]==0)
				m++;
			else
				k++;
		}
		if(m>k)
			m=k;
		printf("%d\n",m);
	}
	return 0;
}


zoj 1949 error correction 

题意:

求出矩阵的每行每列和是否是偶数,否则如果至改变一个数能否,再不行,就算了。

分析:

第二种情况可以改变的只能是只存在一行一列不是奇数才符合。水过。

#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue> 
#include <set>
#include <map>
#include <algorithm>
using  namespace  std;
int main()
{
	int n,i,j;
	int a[102][102];
	while(cin>>n&&n)
	{
		int flag_c=0;
		int flag_r=0;
		int sum_r=0;
		int sum_c=0;
		int cow=0;
		int row=0;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				cin>>a[i][j];
		for(i=1;i<=n;i++)
		{
			sum_r=0;
			sum_c=0;
			for(j=1;j<=n;j++)
			{
				sum_r+=a[i][j];
				sum_c+=a[j][i];
			}
			if(sum_r%2!=0) {flag_r++;row=i;}
			if(sum_c%2!=0) {flag_c++;cow=i;}
		}
		if(flag_c==0&&flag_r==0) cout<<"OK"<<endl;
		else if(flag_c==1&&flag_r==1) printf("Change bit (%d,%d)\n",row,cow);
		else 
			cout<<"Corrupt"<<endl;
	}
	return 0;
}


zoj 2679 old bill

给你turkey的数量和总价(5位数)的中间3个数,要求的是首尾两个数和最大单价。没算法,水过


#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <queue> 
#include <set>
#include <map>
#include <algorithm>
using  namespace  std;
int main ()
{
	int T,N,X,Y,Z,f,b;
	int i,j;
	int value,turkey;
	cin>>T;
	while(T--)
	{
		value=0;
		turkey=0;
		cin>>N>>X>>Y>>Z;
		for(i=9;i>=1;i--)
		{
			for(j=9;j>=0;j--)
			{
				value=i*10000+X*1000+Y*100+Z*10+j;
				if(value%N==0) 
				{
					f=i;
					b=j;
					turkey=value/N;
					break;
				}
			}
			if(turkey) break;
		}
		if(turkey) 
		{
			cout<<f<<" "<<b<<" "<<turkey<<endl;
		}
		else 
			cout<<"0"<<endl;
	}
	return 0;
}


刷了3道题,没什么感觉,18号校赛啊。.。hoho







你可能感兴趣的:(c,算法,ini)