代码改变世界

算法学习之路(2)

2016-12-13 21:29  roffen  阅读(177)  评论(0)    收藏  举报

这段时间学到了快速幂,贪心,不过仅仅是知晓而已

学到了链表结构,和在algorithm库里的sort函数,functional里的great<type>()的使用

 

#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
using namespace std;
int main()
{
/*这道题用了贪心,优先选择顺序如下
如果田忌的最慢比王的最慢快,赢一场;
如果田忌最慢比王的最慢慢,去碰王最快;
如果相等:
如果田忌的最快比王的最快快,赢一场;
如果田忌的最快比王的最快慢,用最慢碰一场;
如果相等:
如果田忌最慢比王的最快慢,碰一场;
否则则是剩下的一样快;


我的想法是通过田忌的最快在王的马里挑到能赢的,然后从剩下的里挑第二快能赢的,以此类推;
但这样会不好处理相等的情况,从网上看到的是考虑相等或大于小于的,以一个最优解的顺序来
执行步骤,不管整体而是集中于每次比较的过程,证明也主要放在这,由此对贪心的理解深入了些*/
int n,h[1000],t[1000];
while (cin >> n&&n)
{
for (int i = 0;i < n;i++)
{
cin >> t[i];
}
for (int i = 0;i < n;i++)
{
cin >> h[i];
}
sort(h, h + n, greater<int>());
sort(t, t + n, greater<int>());
int i = 0, j = 0, i1 = n - 1, j1 = n - 1, money = 0;
while (i <= i1&&j <= j1)
{
if (t[i1] > h[j1])
{
i1--;
j1--;
money += 200;
}
else if (t[i1] < h[j1])
{
i1--;
j++;
money -= 200;
}
else
{
if (t[i] > h[j])
{
i++;
j++;
money += 200;
}
else if (t[i] < h[j])
{
i1--;
j++;
money -= 200;
}
else
{
if (t[i1] < h[j])
{
i1--;
j++;
money -= 200;
}
else if (t[i1] == h[j])
{
break;
}
}
}
}
printf("%d", money);
}
// system("pause");
}
/*int sum_12(int n)
{
int ans = 0;
while (n != 0)
{
ans += n % 12;
n /= 12;
}
return ans;
}
int sum_16(int n)
{
int ans = 0;
while (n != 0)
{
ans += n % 16;
n /= 16;
}
return ans;
}
int sum_10(int n)
{
int ans = 0;
while (n != 0)
{
ans += n % 10;
n /= 10;
}
return ans;
}
int main()
{
int a[10000], k = 0;
for (int i = 2991;i < 10000;i++)
{
int s1 = sum_12(i), s2 = sum_16(i),s3=sum_10(i);
if (s1 == s2&&s1==s3)
{
a[k] = i;
k++;
}
}
for (int i = 0;i < k;i++)
{
printf("%d\n", a[i]);
}
// system("pause");
}*/
/*int main()
{
int a[1000];
int n = 0,i=0;
cin >> n;
while (n != 0)
{
a[i] = n;
int ans = 0,key=0;
while (a[i] % 2 == 0)
{
key++;
a[i] /= 2;
}
ans = pow(2, key);
a[i] = ans;
i++;
cin >> n;
}
for (int k = 0;k < i;k++)
{
cout << a[k] << endl;
}
//system("pause");
}*/
/*int main()
{
int n,s;
cin >> n>>s;
int passengers[1000], time[1000];
for (int i = 0;i < n;i++)
{
cin >> passengers[i] >> time[i];
}
int sum = s - passengers[n - 1];
for (int i = n - 1;i >= 0;i--)
{
if (sum < time[i])
{ sum += time[i] - sum; }
sum += passengers[i] - passengers[i - 1];
}
cout << sum;
system("pause");
}*/
/*struct node
{
int data;
node * next;
};
node * head;
node * create()
{
node * s, *p=NULL;
s = new node;
cin >> s->data;
head = NULL;
while (s->data != 0)
{
if (head == NULL)head = s;
else
{
p->next = s;
}
p = s;
s = new node;
cin >> s->data;
}
p->next = NULL;
delete s;
return(head);
}
int main()
{
node * head = create();
node *p = head;
while (p)
{
cout << p->data << " ";
p=p->next;
}
system("pause");
}*/
/*double s(int a[], int b[], int n)
{
double s = 0;
for (int i = 0;i < n;i++)
{
int j = (i + 1) % n;
s += a[i]*b[j];
s -= a[j]*b[i];
}
if (s >= 0)return s;
else return -s;
}
int main()
{
int a[100], b[100];
int n;
while (cin >> n&&n)
{
for (int i = 0;i < n;i++)
{
cin >> a[i] >> b[i];
}
double S = s(a, b, n) / 2.0;
cout << S << endl;
}
}*/
/*struct matrix//no.2
{
long long nod[2][2]={0,0,0,0};
};
matrix mat_mul(matrix a, matrix b)
{
matrix ans;
for (int i = 0;i < 2;i++)
{
for (int j = 0;j < 2;j++)
{
for (int k = 0;k < 2;k++)
{
ans.nod[i][j] += a.nod[i][k] * b.nod[k][j];
}
}
}
return ans;
}
matrix fastpow(matrix a, long long n)
{
matrix ans;
ans.nod[0][0] = 1,ans.nod[1][1] = 1;
while (n)
{
if (n & 1)ans =mat_mul(a,ans);
a = mat_mul(a, a);
n >>= 1;
}
return ans;
}
int main()
{
long long f1, f2, n;
const long long mod = 1000000007;
matrix ide_mat;
ide_mat.nod[0][0] = 1, ide_mat.nod[0][1] = -1, ide_mat.nod[1][0] = 1, ide_mat.nod[1][1] = 0;
while (cin >> f1 >> f2 >> n)
{
if (n == 1)cout << (f1+mod)%mod<<endl;
else if (n == 2)cout << (f2+mod)%mod<<endl;
else
{
matrix f;
f.nod[0][0] = f2, f.nod[1][0] = f1;
matrix a = fastpow(ide_mat, n - 2);
matrix ans = mat_mul(a, f);
cout << (ans.nod[0][0]+mod) % mod << endl;
}
}
}*/
/*long long mul(long long c, long long b, long long m);
long long pow_(long long c, long long n, long long m);
int main()
{
const long long a = 2;
long long b, m;
while (cin >> b >> m)
{
if (b == 1)
{
if (m == 1)cout << 0;
else cout << 1;
}
else
cout << (pow_(a, b, m) - 2)%m;
}
}
long long mul(long long c, long long b, long long m)
{
long long ans = 0;
while (b)
{
if (b&1)(ans += c) %= m;
(c *= 2) % m;
b >>= 1;
}
return ans;
}
long long pow_(long long c, long long n, long long m)
{
long long ans = 1;
while (n)
{
if (n & 1)ans = mul(ans, c, m);
c = mul(c, c, m);
n >>= 1;
}
return ans;
}*/
/*long long pow_(long long a, long long n, long long m)//快速幂
{
if (n == 0)return 1%m;
long long ans = pow_(a, n / 2, m);
if (n % 2 == 1) return ans*ans*a;
if (n % 2 == 0)return ans*ans;
}
long long mul_(long long a, long long b, long long m)//快速乘
{
long long ans = 0;
while (b)
{
if (b & 1)(ans += a) %= m;
(a *= 2) %= m;
b /= 2;
}
return ans;
}
long long pow__(long long a, long long b, long long m)
{
long long ans = 1;
while (b)
{
if (b & 1)ans = mul_(a, ans, m);
a = mul_(a, a, m);
b /= 2;
}
return ans;
}
int main()
{
const long long i = 2;
long long a, b;
while (cin >> a >> b)
{
cout <<"快速幂"<<pow_(i, a, b) << endl;
cout << "快速乘" << mul_(i, a, b) << endl;
cout << "快速幂【改】!" << pow__(i, a, b) << endl;
}
system("pause");
}*/