列挙練習

3757 ワード

タイトルのソース:
http://coder.buct.edu.cn/oj/Contest/Contest.aspx?cid=1121
第一の問題は簡単なのです。
第二の問題は自分と自分が同じ順序で構成できることに注意しなければなりません。
問題3:浮動小数点型はできるだけ避けましょう。
時間のコントロールに注意します。
 
1:
#include<stdio.h>
int main()
{
	int n,i,t1,t2,t;
	while(scanf("%d",&n)!=EOF){
		scanf("%d %d",&t1,&t2);
		if(t1<t2){
			t1=t1^t2;
			t2=t1^t2;
			t1=t1^t2;
		}//t1    ,t2    
		else if(t1 == t2){
			t2 = -1000001 ;
		}
		for(i = 2;i < n;i++){
			scanf("%d",&t);
			if(t>t1){
				t2 = t1;
				t1 = t;
			}
			else if(t>t2&&t<t1)
				t2 = t;
		}
		if(t2 == -1000001)
			printf("No such number
"); else printf("%d
",t2); } return 0; } 2: #include<stdio.h> const int maxn = 2001; int list[maxn]; int main() { int sum,k,i; while(scanf("%d%d",&sum,&k)!=EOF){ for(i=0;i<k;i++) scanf("%d",&list[i]); int num = 0; for(i=0;i<k;i++){ for(int j=i;j<k;j++)// if(list[i] + list[j] == sum) num++; } printf("%d
",num); } return 0; } 3: #include<stdio.h> int a,b; typedef long long LL; int gcd(int a,int b){ return b?gcd(b,a%b):a; } LL abs(LL x) { return x<0?-x:x; } bool little(int a1,int b1,int a2,int b2) { return abs ((LL)a1*b*b2 - (LL)a*b1*b2) < abs ((LL)a2*b*b1 - (LL)a*b1*b2); } int main() { while(scanf("%d %d",&a,&b)!=EOF){ int c=1,d=1; for(int i = 1;i<= 32767;i++){ int lf = 1,rt = 32767,mid; while(lf+1 < rt){ mid = lf + rt >> 1; little(lf,i,rt,i)?rt = mid:lf = mid; } mid = little(lf,i,rt,i)?lf:rt; int tmp = gcd(mid , i); if((mid/tmp == a)&&(i/tmp ==b)){ if(mid == 1) mid++; else mid--; } if(little(mid,i,c,d)){ c = mid; d = i; } } printf("%d %d
",c,d); } return 0; } 4: #include<cstdio> #include<map> #include<iostream> #include <cstdlib> #include <set> #include<algorithm> using namespace std; const int maxn = 2005; struct node { int x,y; friend bool operator < (node a,node b){ if(a.x == b.x) return a.y < b.y; return a.x < b.x; } }list[maxn]; set <node> S; int yes(node a ,node b) { node c1,d1; int num = 0; c1.x = a.x - (b.y - a.y); c1.y = a.y + (b.x - a.x); d1.x = b.x - (b.y - a.y); d1.y = b.y + (b.x - a.x); if(S.find(c1)!=S.end()&&S.find(d1)!=S.end()){ num++; } return num; } int cmp(node a,node b) { if(a.x == b.x) return a.y>b.y; return a.x>b.x; } int main() { int n,i; while(scanf("%d",&n)!=EOF&&n){ for(i=0;i<n;i++){ scanf("%d %d",&list[i].x,&list[i].y); S.insert(list[i]); } sort(list,list+n,cmp); int num = 0; for(i = 0;i < n;i ++){ for(int j = i+1;j<n;j ++){ num+=yes(list[i],list[j]); } } printf("%d
",num/2); S.clear(); } return 0; }