61、2061
题目有问题N写小于等于50会wa。
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
int m, n;
while (cin >> n)
{
string s;
double num ;
double fen;
for (int i = 0; i < n; i++)
{
double sumf = 0 ;
double sum = 0 ;
bool exist = true;
cin >> m;
for (int j = 0; j < m; j++)
{
cin >> s>>fen>>num;
if (num<60) { exist = false; }
sumf += fen;
sum += fen * num;
}
if (i != 0)cout << endl;
if (exist==false) { cout << "Sorry!" << endl; }
else {
cout << fixed << setprecision(2) << sum / sumf << endl;
}
}
}
return 0;
}
62、2062
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
void check(int n, long long m)
{
long long c[100];
c[0] = 0;
int a[100];
for (int i =1; i <= n; i++)
{
c[i] = (i - 1) * c[i - 1] + 1;
}
for (int i = 1; i < n+1; i++)
{
a[i] = i;
}
long long k = 1;
int index = 0;
while (k != 0)
{
k = (m - 1) % c[n];//每次求出是第几个位置
index = (m - 1) / c[n] + 1;
cout << a[index];//这个位置的值是多少
for (int i = index; i < n+1; i++)
{
a[i] = a[i+1];//除掉以输出的值
}
m=k;
n--;
if (k != 0)cout << " ";
}
cout << endl;
}
int main()
{
int n;
long long m;
while (cin >> n>>m)
{
check(n,m);
}
return 0;
}
63、2063
#include<iostream>
#include<cstring>
using namespace std;
int k[502][502];
int flag[502] = {0};
int v[502] = { 0 };
int m, g;
bool check(int n)
{
for (int j = 1; j <= m; j++)
{
if (v[j] == 0 && k[n][j]==1)
{
v[j] = 1;
if (flag[j] == 0 || check(flag[j]))
{
flag[j] = n;
return true;
}
}
}
return false;
}
int main()
{
int n;
while (cin >> n)
{
if (n == 0)break;
int p1, p2;
cin >> g >> m;
memset(flag, 0, sizeof(flag));
memset(k, 0, sizeof(k));
for (int i = 0; i < n; i++)
{
cin >>p1>>p2;
k[p1][p2] = 1;
}
int sum = 0;
for (int i = 1; i <=g; i++)
{
memset(v, 0, sizeof(v));
if (check(i))sum++;
}
cout << sum << endl;
}
return 0;
}
64、2064
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m;
while(cin>>m)
{
long long res=1;
while(m--) res*=3;
cout<<res-1<<endl;
}
return 0;
}
65、2065
#include<iostream>
#include<cstring>
using namespace std;
long long check(long long base,long long n)
{
long long result = 1;
while (n > 0)
{
if (n % 2 == 0)
{
n = n / 2;
base = base * base % 100;
}
else {
n -= 1;
result = base * result % 100;
n = n / 2;
base = base * base % 100;
}
}
return result;
}
int main()
{
int n;
while (cin >> n&&n!=0)
{
long long m;
for (int i = 0; i < n; i++)
{
cin >> m;
m = m - 1;
cout << "Case " << i+1 << ": " << (check(4,m)+check(2,m))%100<<endl;
}
cout << endl;
}
return 0;
}
66、2066
#include<iostream>
using namespace std;
#define inf 99999
#define max 1001
int map[max][max];//存储距离的邻接矩阵
int mark[max];//标记城市是否被访问
int len;//存储最大号的城市
int S, D, T;
int c ;//城市
int w,m;//w:想去的城市,m:城市的最大编号
int k;//存储当前距离最短的城市
void init_shuzu()//初始化邻接矩阵
{
for (int i = 0; i < max; i++)
{
for (int j = 0; j < max; j++)
{
map[i][j] = inf;
}
mark[i] = 0;
}
len = 0;
}
void dijstra()
{
for (int i = 1; i <= len; i++)
{
m = inf;
for (int j = 1; j <= len; j++)//找到未被访问过的距离最短的城市
{
if (map[0][j] < m && mark[j] == 0)
{
m = map[0][j];
k = j;
}
}
if (m ==inf)break;
mark[k] = 1;
for (int j = 0; j <=len; j++)
{
if (mark[j] == 0 && map[0][j] > map[0][k] + map[k][j])//比较
{
map[0][j] = map[0][k] + map[k][j];
}
}
}
}
int main()
{
while (cin>>T>>S>>D)
{
init_shuzu();
//初始化邻接矩阵
int a, b, time;
for (int i = 0; i < T; i++)
{
cin >> a >> b >> time;
if (a > len)len = a;
if (b > len)len = b;
if (time < map[a][b])map[b][a] = map[a][b] = time;
}
for (int i = 0; i < S; i++)
{
cin >> c;
map[0][c]= 0;
}
dijstra();//得到一个距离的所有城市最短路径的图。
m = inf;
for (int j = 0; j < D; j++)
{
cin >> w;
if (map[0][w] < m)m = map[0][w];
}
cout<< m <<endl;
}
}
67、2067
#include<iostream>
using namespace std;
int main()
{
int m;
int num=0;
while (cin >> m)
{
if (m == -1)break;
long long catalan[36]{0};
catalan[0] = 1;
catalan[1] = 1;
for (int i = 2; i <=m; i++)
{
for (int j = 0; j < i ; j++)
{
catalan[i] += catalan[j]*catalan[i - j - 1];
}
}
num++;
cout << num << " " << m << " " << catalan[m] * 2 << endl;
}
}
68、2068
#include<iostream>
using namespace std;
long long comb(int m, int n)//求组和
{
long long sum = 1;
if (m - n < n)n = m - n;
for (int i = m; i >= m - n + 1; i--)
{
sum *= i;
}
for (int i = 1; i <= n; i++)
{
sum /= i;
}
return sum;
}
int main()
{
int m;
long long f[26] = { 0,0,1 };
for (int i = 3; i <26; i++)
{
f[i] = (i - 1) * (f[i - 1] + f[i - 2]);//错排公式
}
while (cin >> m)
{
if (m == 0)break;
int num = (m + 1) / 2;
long long sum = 0;
for (int i = num; i <= m; i++)
{
sum += f[m - i] * comb(m,i);
}
sum += 1;
cout << sum << endl;
}
}
79、2079
#include<iostream>
using namespace std;
int a[9]{ 0 };
int sum;
int n;//学分
void dfs(int key,int t)
{
if (key == n)
{
sum++;
return;
}
if (key > n)return;
for (int i = t+1; i < 9; i++)
{
for (int j = 1; j <= a[i]; j++)
{
dfs(key + i * j, i);
}
}
}
int main()
{
int p;
int b;
int T;//几组数据
int k;//k行
while (cin>>T)
{
for (int i = 0; i < T; i++)
{
sum = 0;
cin >> n >> k;
for (int j = 0; j < k; j++)
{
cin >> p>>b;
a[p]=b;
}
dfs(0,0);
cout << sum << endl;
}
}
}
80、2080
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
int T;
double x1, x2, y1, y2;
double s;
double ans,a,b;
while (cin >> T)
{
for (int i = 0; i < T; i++)
{
cin >> x1 >> y1 >> x2 >> y2;
a = sqrt(x1 * x1 + y1 * y1); b = sqrt(x2 * x2 + y2 * y2);
ans = 1.0 * (x1 * x2 + y1 * y2) / (a * b);
ans = (1.0 * acos(ans) / 3.1415926535898) * 180;
cout << fixed<<setprecision(2)<<ans << endl;
}
}
}